【问题标题】:Frozen mock's property is getting overwrittenFrozen mock 的属性被覆盖
【发布时间】:2013-02-20 21:31:22
【问题描述】:

我遇到了一个问题,AutoFixture 似乎正在覆盖冻结模拟上的属性。模拟类的属性是只读的,根据我的阅读,AutoFixture 不应该尝试对它做任何事情。

我在下面的 LINQPad 中包含了重现该问题的代码。 Victim 是一个简单的测试类,有两个只读属性。问题在于,一旦我设置了 Things 属性的期望并将模拟的 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();
}

【问题讨论】:

    标签: c# unit-testing moq autofixture


    【解决方案1】:

    我的猜测是 ThingsIterator 实际上是相同的,但它生成的字符串不同。这是actually by design,尽管我们后来意识到这不是一个特别好的设计决策。

    AutoFixture 3, this behavior has been changed

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

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

    【讨论】:

    • 啊,我不知道迭代器是一个生成器。我只是希望随后对冻结类型的CreateMany 调用将返回不同的序列。这清楚了很多;感谢您的帮助。
    • 顺便说一下,StableMultipeCustomization 不是错字,在上面 Mark 引用的博客文章中定义;它不包含在 AutoFixture 2.16.2 中(这是我正在使用的)。
    猜你喜欢
    • 2013-01-19
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多