最小起订量 - 将 .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
上定义的虚拟方法,即 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);
我不知道如何让 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
上定义的虚拟方法,即 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);