我遇到了一个问题,即 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();
}
最佳答案
我的猜测是 Things
的 Iterator 实际上是相同的,但是它生成的字符串不同。这是 actually by design ,尽管我们后来意识到这不是一个特别好的设计决策。
在 AutoFixture 3, this behavior has been changed 中。
如果我猜对了,这个问题将在 AutoFixture 3 中消失。在 AutoFixture 2 中,您应该能够通过创建这样的夹具来解决它:
var fixture = new Fixture().Customize(new StableMultipeCustomization());
关于c# - 卡住模拟的属性被覆盖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14990320/