代码之家  ›  专栏  ›  技术社区  ›  arcain

Frozen mock的属性正在被覆盖

  •  3
  • arcain  · 技术社区  · 12 年前

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

    我在下面的LINQPad中包含了重现该问题的代码。 Victim 是一个具有两个只读属性的平凡测试类。争论的焦点是,一旦我设定了对 Things 财产,并注册了mock的 Object 作为AutoFixture返回的实例 受害者 类型,集合 东西 包含不同的字符串。

    要重现此问题,请在LINQPad中以 C#程序 和参考 自动夹具 月平均收入 来自NuGet。请确保包含命名空间 月平均收入 犁.自动夹具 .

    我的期望是我应该取回我注册的对象 Register 并且该集合 东西 在返回的 受害者 应该返回我在调用中引用的集合 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();
    }
    
    1 回复  |  直到 12 年前
        1
  •  4
  •   arcain    12 年前

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

    在里面 AutoFixture 3, this behavior has been changed .

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

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