最小起订量 - 将 .Equals 方法设置为 return false

Moq - Setup .Equals method to return false

我不知道如何让 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)总是returns真。

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

这是 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);