11

在这里查看帖子时,看起来我应该能够使用 创建多个对象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();
4

1 回答 1

9

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

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

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

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

public class StableFiniteSequenceCustomization : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Customizations.Add(new StableFiniteSequenceRelay());
    }
}
于 2011-05-31T05:28:27.273 回答