我无法弄清楚如何让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
方法?我错过了什么?
答案 0 :(得分:2)
这是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));
由于您正在使用界面,因此您只需在其上声明方法:bool Equals(object o);