我不知道如何让 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。
是否可以使用 Moq
模拟 .Equals
方法?我错过了什么?
最佳答案
这是 CaSTLe.Core 的限制(由 Moq 和其他模拟框架(如 NSubstitute)内部使用)。它无法覆盖 System.Object
上定义的虚拟方法,即 ToString
、Equals
和 GetHashCode
。
解决方法是在继承树中的某个位置手动重写这些方法。
例如,这将失败:
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));
由于您使用的是接口(interface),因此只需在其上声明方法即可:bool Equals(object o);
关于c# - Moq - 设置 .Equals 方法返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36260465/