我遇到了AutoFixture似乎覆蓋了凍結模擬上的屬性的問題。模擬類的屬性是隻讀的,從我讀過的內容來看,AutoFixture不應該試圖對它做任何事情。凍結模擬的財產被覆蓋
我已經包含了在下面的LINQPad中重現問題的代碼。 Victim
是一個具有兩個只讀屬性的簡單測試類。問題是,一旦我已經設置了Things
屬性的期望並且將模擬的Object
註冊爲AutoFixture爲Victim
類型返回的實例,則集合Things
包含不同的字符串。
要重現該問題,在LINQPad作爲C#程序運行下面的代碼和參考AutoFixture和Moq的從的NuGet。一定要包含命名空間Moq和Ploeh.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();
}
啊,我不知道*迭代器是一個生成器*。我只是希望對'CreateMany'進行的後續調用可以返回一個不同的序列。這清理了很多;謝謝您的幫助。 – arcain 2013-02-21 00:31:58
順便說一下,'StableMultipeCustomization'不是拼寫錯誤,並且在Mark上面引用的博客文章中定義;它不包含在AutoFixture 2.16.2中(這是我使用的)。 – arcain 2013-02-21 00:34:32