2013-02-20 69 views
3

我遇到了AutoFixture似乎覆蓋了凍結模擬上的屬性的問題。模擬類的屬性是隻讀的,從我讀過的內容來看,AutoFixture不應該試圖對它做任何事情。凍結模擬的財產被覆蓋

我已經包含了在下面的LINQPad中重現問題的代碼。 Victim是一個具有兩個只讀屬性的簡單測試類。問題是,一旦我已經設置了Things屬性的期望並且將模擬的Object註冊爲AutoFixture爲Victim類型返回的實例,則集合Things包含不同的字符串。

要重現該問題,在LINQPad作爲C#程序運行下面的代碼和參考AutoFixtureMoq的從的NuGet。一定要包含命名空間MoqPloeh.AutoFixture

我意料的是,我應該回去我跟Register,並且在返回Victim收集Things應該回到我在我的電話參考SetupGet集合註冊的對象。

public class Victim 
{ 
    private string _vic; 
    private IEnumerable<string> _things; 
    public virtual string VictimName { get { return _vic; } } 
    public virtual IEnumerable<string> Things { get { return _things; } } 
} 

void Main() 
{ 
    var fixture = new Fixture(); 
    var victimName = fixture.CreateAnonymous("VIC_"); 
    var things = fixture.CreateMany<string>(); 
    victimName.Dump("Generated vic name"); 
    things.Dump("Generated things"); 

    var victimMock = fixture.Freeze<Mock<Victim>>(); 
    victimMock.SetupGet(x => x.VictimName).Returns(victimName).Verifiable(); 
    victimMock.SetupGet(x => x.Things).Returns(things).Verifiable(); 
    fixture.Register(() => victimMock.Object); 

    var victim = fixture.CreateAnonymous<Victim>(); 
    (victim.Equals(victimMock.Object)).Dump("Victims are the same?"); 
    victim.VictimName.Dump("Returned name"); 
    victim.Things.Dump("Returned things"); 
    (things.Equals(victim.Things)).Dump("Returned things are the same?"); 

    victimMock.Verify(); 
} 

回答

4

我的猜測是,迭代Things實際上是一樣的,但是它生成的字符串是不同的。這是actually by design,雖然我們後來認識到這不是一個特別好的設計決定。

AutoFixture 3, this behavior has been changed

如果我猜對了,這個問題將在AutoFixture 3.走在AutoFixture 2,你應該能夠創造這樣的夾具來解決它:

var fixture = new Fixture().Customize(new StableMultipeCustomization()); 
+0

啊,我不知道*迭代器是一個生成器*。我只是希望對'CreateMany'進行的後續調用可以返回一個不同的序列。這清理了很多;謝謝您的幫助。 – arcain 2013-02-21 00:31:58

+0

順便說一下,'StableMultipeCustomization'不是拼寫錯誤,並且在Mark上面引用的博客文章中定義;它不包含在AutoFixture 2.16.2中(這是我使用的)。 – arcain 2013-02-21 00:34:32