我遇到了一个问题,AutoFixture 似乎正在覆盖冻结模拟上的属性。模拟类的属性是只读的,根据我的阅读,AutoFixture 不应该尝试对它做任何事情。
我在下面的 LINQPad 中包含了重现该问题的代码。Victim
是一个具有两个只读属性的普通测试类。问题在于,一旦我为Things
属性设置了期望并将模拟注册Object
为 AutoFixture 以返回该Victim
类型的实例,该集合将Things
包含不同的字符串。
要重现此问题,请在 LINQPad 中将以下代码作为C# 程序运行,并从 NuGet引用AutoFixture和Moq 。请务必包含命名空间Moq和Ploeh.AutoFixture。
我的期望是我应该取回我注册的对象,Register
并且Things
返回Victim
的集合应该返回我在调用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();
}