如何仅在列表中的项目的子范围上分配属性?

我想使用AutoFixture创建自定义对象列表。 我希望前N对象的属性设置为一个值,剩余部分将其设置为另一个值(或者简单地由Fixture的默认策略设置)。

我知道我可以使用Fixture.CreateMany.With ,但这Fixture.CreateMany.With一个函数应用于列表的所有成员。

NBuilder有一些名为TheNextTheNext (以及其他)的方法可以提供此function。 他们使用的一个例子:

鉴于Foo类:

 class Foo { public string Bar {get; set;} public int Blub {get; set;} } 

可以像这样实例化一堆Foo

 class TestSomethingUsingFoo { /// ... set up etc. [Test] public static void TestTheFooUser() { var foosToSupplyToTheSUT = Builder.CreateListOfSize(10) .TheFirst(5) .With(foo => foo.Bar = "Baz") .TheNext(3) .With(foo => foo.Bar = "Qux") .All() .With(foo => foo.Blub = 11) .Build(); /// ... perform the test on the SUT } } 

这给出了Foo类型的对象列表,其中包含以下属性:

 [Object] Foo.Bar Foo.Blub -------------------------------- 0 Baz 10 1 Baz 10 2 Baz 10 3 Baz 10 4 Baz 10 5 Qux 10 6 Qux 10 7 Qux 10 8 Bar9 10 9 Bar10 10 

Bar9Bar10值代表NBuilder的默认命名方案)

是否有使用AutoFixture实现此function的“内置”方式? 或者一种惯用的方法来设置一个像这样的夹具?

到目前为止,最简单的方法是这样的:

 var foos = fixture.CreateMany(10).ToList(); foos.Take(5).ToList().ForEach(f => f.Bar = "Baz"); foos.Skip(5).Take(3).ToList().ForEach(f => f.Bar = "Qux"); foos.ForEach(f => f.Blub = 11); 

为C#已经内置了为属性赋值的function,因此AutoFixture的理念是使用已经可用的语言结构 ,而不是提供一个限制性API,使您无法完成所有想要做的事情。

下一个哲学步骤是,如果你经常需要做那样的事情,那么SUT可能会从重新设计中受益。