2011-05-31 67 views
8

當在後here看,它看起來像我應該能夠創建使用CreateMany()幾個對象,他們重複使用foreach過來,然後返回它們作爲一個數組。AutoFixture IEnumerable的<T>行爲與CreateMany()

我看到的是,每次迭代似乎每次都會創建新對象。這是預期的行爲?

實體創建:

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

回答

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()); 
    } 
} 
+0

再次出色的幫助!我已經接受了答案,但是如果你能詳細說明「AutoFixture真的竭盡全力確保你只得到你所要求的東西」,那麼它就是++。也就是說,我可能需要一些關於我所要求的教育! :) – rbellamy 2011-05-31 06:10:36

+2

深層次的解釋需要整個博客文章(它*將*看到未來的一天)。簡短的回答是'IEnumerable '的'合同'只指定了一個迭代器。它與列表不一樣。不穩定的迭代器甚至是發生器也適合這個接口。 – 2011-05-31 07:10:15

+1

因此'收益'行爲? – rbellamy 2011-05-31 09:15:31

相關問題