如何仅在列表中的项目的子范围上分配属性?
我想使用AutoFixture
创建自定义对象列表。 我希望前N
对象的属性设置为一个值,剩余部分将其设置为另一个值(或者简单地由Fixture
的默认策略设置)。
我知道我可以使用Fixture.CreateMany.With
,但这Fixture.CreateMany.With
一个函数应用于列表的所有成员。
在NBuilder
有一些名为TheNext
和TheNext
(以及其他)的方法可以提供此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
( Bar9
和Bar10
值代表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可能会从重新设计中受益。