AutoFixture使用CreateMany()</t>进行IEnumerable <t>行为

时间:2011-05-31 00:34:39

标签: c# autofixture

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

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

要创建的实体:

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

示例Program.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));
    }
}

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

编辑2011-06-02

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

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

1 个答案:

答案 0 :(得分:6)

这确实是预期的默认行为。这有很多原因,但基本上可以归结为当你要求IEnumerable<T> AutoFixture时,实际上会花很多时间来确保你只得到你所要求的东西。

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

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

这将改变行为,使得随后所有序列都是稳定的。您可以将该方法调用打包到Customization for better reusability。这可能看起来像这样(完全可选):

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