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

Pet*_*ter 6 .net c# unit-testing mocking autofixture

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

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

NBuilder那里提供了名称TheFirstTheNext(以及其他)提供此功能的方法.他们使用的一个例子:

给出一个类Foo:

class Foo
{
    public string Bar {get; set;}
    public int Blub {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

一个人可以Foo像这样实例化一堆s:

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 
    }
}
Run Code Online (Sandbox Code Playgroud)

这给出了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
Run Code Online (Sandbox Code Playgroud)

(Bar9Bar10值表示NBuilder默认命名方案)

是否有"内置"方式来实现此目的AutoFixture?或者设置一个像这样的夹具的惯用方法?

Mar*_*ann 10

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

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);
Run Code Online (Sandbox Code Playgroud)

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

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