Moq比较不一致

时间:2015-08-27 20:06:58

标签: c# moq castle-dynamicproxy

我使用Moq框架进行模拟。我发现Equals覆盖不能按预期工作的问题。似乎动态对象中必须有一个总是返回false的覆盖。这是一些示例代码。我正在使用nuget的Moq版本4.2.1507.0118。

public class B
{
    public override bool Equals(object obj)
    {
        return base.Equals(obj);
    }
}

class Program
{
    static void Main(string[] args)
    {
        var a = new Moq.Mock<B>().Object;
        var b = a;
        bool equalsOperator = a == b; //returns true
        bool referenceEquals = object.ReferenceEquals(a, b); //returns true
        bool equals_b = a.Equals(b); //returns false
        bool equals_a = a.Equals(a); //returns false
    }
}

另一个有趣的事情是,如果在Equals覆盖上放置断点,它永远不会被击中。 Moq框架中是否存在错误,或者我做错了什么?

1 个答案:

答案 0 :(得分:5)

要解决此问题,您必须将moq的CallBase属性设置为true,设置该属性以确保您正在调用基本实现或其重写方法。

var a = new Moq.Mock<B>().Object;

将此更改为

var a = new Moq.Mock<B>() { CallBase = true }.Object;

Moq Quickstart(强调添加):

  

让模拟表现得像一个“真正的模拟”,为任何没有相应期望的事物提出例外:在Moq中俚语“严格”模拟; 默认行为是“松散”模拟,如果没有为成员设置期望,它永远不会抛出并返回默认值或空数组,枚举等等

因此,您获得了falsedefault value获得了布尔。