使用受约束的随机值自定义AutoFixture属性生成

时间:2018-12-07 07:37:06

标签: c# unit-testing autofixture

上下文

我想创建一个类的集合,但是它的某些字符串属性具有受约束的值。我希望这些值在约束集中仍然是随机的。

我想出了自定义方式,但是我的随机生成实现似乎没有使用任何AutoFixture功能,并且我不想重新发明轮子:

var random = new Random();
var fixture = new Fixture();
fixture.Customize<MyClass>(b => b
    .With(i => i.MyProperty, random.Next(2) == 0 ? "O" : "C"));

var result = fixture.CreateMany<MyClass>(1000);

问题

有没有更有效的方法告诉AutoFixture我想要一个随机字符串“ O”或“ C”?

修改

与此同时,我意识到上面的代码根本不起作用,因此它不符合“备份”计划的要求。 (表达式:random.Next(2)== 0?“ O”:“ C”仅计算一次)

1 个答案:

答案 0 :(得分:0)

AutoFixture 4.6.0起,您可以在With自定义函数中使用回调。这样可以限制字段值,但让它在创建的样本中仍然变化。

源代码示例:

[Fact]
public void CustomizeMany()
{
    var fixture = new Fixture();
    var items = fixture.Build<MyClass>()
        .With(x => x.EvenNumber, (int number) => number * 2)
        .CreateMany(1000)
        .ToArray();

    Assert.All(items, item => Assert.Equal(0, item.EvenNumber % 2));
}

public class MyClass
{
    public int EvenNumber { get; set; }
}

您可以调整样本以满足您的特定需求。