在AutoFixture中基于另一个属性设置一个属性

5

我正在尝试使用AutoFixture创建一个测试数据对象,其中一个属性与另一个属性相关联,并且其中一个属性是作为夹具的一部分创建的。

到目前为止,我的代码如下:

fixture = new Fixture().Customize(new MultipleCustomization());
Object object;
double constant;
object = fixture.Build<Object>()
                .With(o => o.PropertyOne, fixture.Create<double>)
                .With(o => o.PropertyTwo, constant * o.PropertyOne)
                .Create());

这个方法行不通,因为"The name 'o' does not exist in the current context",这是有道理的。

有没有办法在创建fixture的过程中解决这个问题?

我的情况有点复杂,因为我实际上正在生成一个列表,所以代码看起来像:

fixture = new Fixture().Customize(new MultipleCustomization());
List<Object> objectListFixture;
double constant;
objectListFixture.AddRange(
    fixture.Build<Object>()
           .With(o => o.PropertyOne, fixture.Create<double>)
           .With(o => o.PropertyTwo, constant * o.PropertyOne)
           .CreateMany());

如果可能的话,我希望能避免使用for循环。


“the same double is created for each member of the list” 是什么意思? - Mark Seemann
创建的双倍赛例,用于“PropertyOne”。 - yinnonsanders
抱歉,我无法重现那个问题。如果我在我的答案中运行代码,则“PropertyOne”值会有所不同。 - Mark Seemann
我觉得我误解了你的回答(关于先填充PropertyOne的部分),现在它对我来说已经可以工作了。 - yinnonsanders
没问题,我最终在代码面前下定决心,找到了问题所在。请查看我的更新答案。 - Mark Seemann
它完全可以工作,但我想最终可能会选择 Select。谢谢! - yinnonsanders
1个回答

10

这样做应该可以,不过您可能需要首先填充o.PropertyOne:

var fixture = new Fixture();
var objs = fixture
    .Build<MyObject>()
    .Without(o => o.PropertyOne)
    .Without(o => o.PropertyTwo)
    .Do(o =>
        {
            o.PropertyOne = fixture.Create<double>();
            o.PropertyTwo = o.PropertyOne;
        })
    .CreateMany()
    .ToList();

然而,如果PropertyTwo依赖于PropertyOne,将该规则作为对象设计的一部分实现会更好吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接