自定义在自动固定装置中创建匿名序列



使用匿名序列,当我不太关心有多少或是什么类型的序列时,我可以创建对象序列:

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);
}

这个测试并不强大,但我希望它能传达核心思想。

最新更新