我想使用AutoFixture
创建一个自定义对象列表。我希望第一个N
对象的属性设置为一个值,其余的将其设置为另一个值(或简单地由Fixture
的默认策略设置)。
我知道我可以使用Fixture.CreateMany<T>.With
,但这会将一个函数应用于列表的所有成员。
在NBuilder
中,有名为TheFirst
和TheNext
的方法(以及其他方法)提供了此功能。使用示例:
给定一个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<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),该API无法使您能够做所有想做的事情。
下一步的哲学步骤是,如果您经常需要执行类似操作,则SUT可能会受益于重新设计。