c# - Moq - 设置 .Equals 方法返回 false

标签 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。

是否可以使用 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));

由于您使用的是接口(interface),因此只需在其上声明方法即可:bool Equals(object o);

关于c# - Moq - 设置 .Equals 方法返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36260465/

相关文章:

c# - 更新面板触发时未保存复选框状态

java - 为 JUnit 创建自己的 @Test 注释

c# - 模拟 DbContext SaveChanges() 方法不返回任何值

c# - 最小起订量在第二次验证时未执行任何调用

python - `tkinter.iconbitmap` 方法返回空字符串

c# - 如何使用 Moq 创建带有 JSON 正文的模拟 HTTP 发布请求

c# - 通过构造函数使用主键初始化 EF(6) 对象(最佳实践?)

c# - mvcsitemapprovider - 从不同的页面导航到相同的 ActionResult

c# - 相交 LINQ 查询

c++ - 单元测试的目的是什么?