在 AutoFixture 中自定义匿名序列的创建

Customizing the creation of anonymous sequences in AutoFixture

使用 anonymous sequences,当我不太关心对象的数量或序列类型时,我可以创建对象序列:

public class Foo { public string Bar { get; set; } }

var fixture = new Fixture();
var foos = fixture.CreateMany<Foo>();

有什么方法可以自定义创建此类序列,例如在集合中的每个项目上设置一个 属性,以一次考虑整个集合的方式,而不是一次只考虑一个项目?

例如,有没有办法实现如下?

public interface ISortable
{
    int SortOrder { get; set; }
}

public class Foo : ISortable
{
    public string Bar { get; set; }
    public int SortOrder { get; set; }
}

var fixture = new Fixture();

// TODO: Customize the fixture here

var foos = fixture.CreateMany<Foo>();

// foos now have sort-order set to e.g. a multiple of their index
// in the list, so if three items, they have sort order 0, 10, 20.

自从我移交 AutoFixture 的控制权以来已经有一段时间了,所以我的信息可能已经过时了,但我认为没有这样的功能。在这种情况下,我通常做的是使用普通代码来配置 AutoFixture 生成的内容。在这种特殊情况下,您可以使用 zip 来获得所需的结果;原型:

[Fact]
public void SetSortOrderOnFoos()
{
    var fixture = new Fixture();
    var foos = fixture
        .CreateMany<Foo>()
        .Zip(
            Enumerable.Range(0, fixture.RepeatCount),
            (f, i) => { f.SortOrder = i * 10; return f; });

    Assert.Equal(3, foos.Count());
    Assert.Equal( 0, foos.ElementAt(0).SortOrder);
    Assert.Equal(10, foos.ElementAt(1).SortOrder);
    Assert.Equal(20, foos.ElementAt(2).SortOrder);
}

这个测试不够可靠,但我希望它传达了核心思想。