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

本文关键字:范围 分配 属性 项目 何仅 列表 | 更新日期: 2023-09-27 18:34:52

我想使用 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

(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# 中,因此 AutoFixture 的理念是使用已有的语言构造,而不是提供无法使你执行所有

操作的限制性 API。

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