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

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

NBuilder中,有名为TheFirstTheNext的方法(以及其他方法)提供了此功能。使用示例:

给定一个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

(Bar9Bar10值表示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可能会受益于重新设计。

09-04 11:12
查看更多