Moq - 设置.Equals方法返回false

时间:2016-03-28 10:29:55

标签: c# unit-testing moq

我无法弄清楚如何让Moq在对象上设置.Equals方法。以下断言失败:

var Song = new Mock<ISong>();
Song.Setup(x => x.Equals(Song.Object))
    .Returns(false);

Assert.IsFalse(Song.Object.Equals(Song.Object));

换句话说,Song.Object.Equals(Song.Object)总是返回true。

是否可以使用.Equals模拟Moq方法?我错过了什么?

1 个答案:

答案 0 :(得分:2)

这是Castle.Core的限制(由Moq和其他模拟框架(如NSubstitute)内部使用)。它无法覆盖System.Object上定义的虚拟方法,即ToStringEqualsGetHashCode

解决方法是在继承树中的某处手动覆盖这些方法。

例如,这将失败:

public class Class {}

var m = Mock.Of<Class>(c =>
    c.Equals(It.IsAny<object>()) == true
    );

Assert.True(m.Equals(null));

但这会通过:

public class Class
{
    public override bool Equals(object o) => base.Equals(o);
}

var m = Mock.Of<Class>(c =>
    c.Equals(It.IsAny<object>()) == true
    );

Assert.True(m.Equals(null));

由于您正在使用界面,因此您只需在其上声明方法:bool Equals(object o);