冷冻模拟';的属性正在被覆盖

本文关键字:覆盖 属性 模拟 冷冻 | 更新日期: 2023-09-27 18:00:28

我遇到一个问题,AutoFixture似乎覆盖了冻结mock上的属性。模拟类的属性是只读的,从我读到的内容来看,AutoFixture不应该试图对它做任何事情

我在下面的LINQPad中包含了重现该问题的代码。Victim是一个具有两个只读属性的平凡测试类。问题是,一旦我设置了Things属性的期望值,并将mock的Object注册为AutoFixture为Victim类型返回的实例,集合Things就包含不同的字符串。

要重现此问题,请在LINQPad中以C#程序的形式运行以下代码,并参考NuGet中的AutoFixtureMoq。请确保包含命名空间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();
}

冷冻模拟';的属性正在被覆盖

我的猜测是Things迭代程序实际上是相同的,但它生成的字符串不同。这实际上是经过设计的,尽管我们后来意识到这不是一个特别好的设计决定。

在AutoFixture 3中,此行为已更改。

如果我猜对了,这个问题将在AutoFixture 3中消失。在AutoFixture 2中,你应该能够通过创建这样的夹具来解决它:

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