我想使用AutoFixture创建自定义对象列表.我希望前N个对象的属性设置为一个值,剩余部分将其设置为另一个值(或者简单地由Fixture的默认策略设置).
我知道我可以使用Fixture.CreateMany< T> .With,但这会将一个函数应用于列表的所有成员.
在NBuilder中,有一些名为TheFirst和TheNext(以及其他)的方法可以提供此功能.他们使用的一个例子:
鉴于Foo类:
class Foo { public string Bar {get; set;} public int Blub {get; set;} }
可以像这样实例化一堆Foos:
class TestSomethingUsingFoo { /// ... set up etc. [Test] public static void TestTheFooUser() { var foosToSupplyToTheSUT = Builder<Foo>.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实现此目的?或者设置一个像这样的夹具的惯用方法?
解决方法
到目前为止,最简单的方法是这样的:
var foos = fixture.CreateMany<Foo>(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#内置了为属性赋值的功能,因此不是提供限制性API,而是无法让您执行您想要执行的所有操作,the AutoFixture philosophy is to use the language constructs already available.
下一个哲学步骤是,如果你经常需要这样做,SUT可能会受益于重新设计.