AutoFixture IEnumerable<T> behavior with CreateMany()

本文关键字:CreateMany with behavior IEnumerable lt AutoFixture gt | 更新日期: 2023-09-27 17:57:56

当看到这里的帖子时,看起来我应该能够使用CreateMany()创建几个对象,使用foreach迭代它们,然后将它们作为数组返回。

我看到的是,每次迭代似乎都会创建新的对象。这是预期的行为吗?

要创建的实体:

public class TestEntity
{
    public int Id { get; private set; }
    public string SomeString { get; set; }
    public void SetId(int value)
    {
        this.Id = value;
    }
}

示例程序.cs:

private static int id;
static void Main(string[] args)
{
    var fixture = new Fixture();
    IEnumerable<TestEntity> testEntities = 
      fixture.Build<TestEntity>().CreateMany(5);
    Output(testEntities);
    foreach (var testEntity in testEntities)
    {
        testEntity.SetId(id++);
        Console.WriteLine(
          string.Format("CHANGED IN FOREACH:: hash: {0}, id: {1}, string: {2}", 
          testEntity.GetHashCode(), testEntity.Id, testEntity.SomeString));
    }
    Output(testEntities);
}
private static void Output(IEnumerable<TestEntity> testEntities)
{
    foreach (var testEntity in testEntities)
    {
        Console.WriteLine(
          string.Format("hash: {0}, id: {1}, string: {2}", 
          testEntity.GetHashCode(), testEntity.Id, testEntity.SomeString));
    }
}

我在这里创建了一个问题(如果这是预期的行为,可能会被删除)。

编辑2011-06-02

为了得到我期望的行为,如果我不想修改AutoFixture行为,我可以使用一个扩展方法:

var fixture = new Fixture();
TestEntity[] testEntities = fixture.Build<TestEntity>().CreateMany(5).ToArray();

AutoFixture IEnumerable<T> behavior with CreateMany()

这确实是预期的默认行为。原因有很多,但基本上可以归结为,当你要求IEnumerable<T> AutoFixture时,实际上会竭尽全力确保你只得到你想要的。

这对许多人来说都是令人惊讶的行为。好消息是你可以改变它。

fixture.Customizations.Add(new StableFiniteSequenceRelay());

这将改变行为,从而随后所有序列都是稳定的。您可以将该方法调用打包到Customization中,以获得更好的可重用性。这可能看起来像这样(完全可选):

public class StableFiniteSequenceCustomization : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Customizations.Add(new StableFiniteSequenceRelay());
    }
}