使用Moq模拟GetHashCode

时间:2013-09-07 08:59:04

标签: unit-testing mocking moq

任何人都可以解释为什么以下测试失败了吗?

Assert和Verify都失败了。

public interface ISomeInterface { }

[TestMethod]
public void FailingTest()
{
    var mock = new Mock<ISomeInterface>();
    mock.Setup(m => m.GetHashCode()).Returns(42);

    int hashCode = mock.Object.GetHashCode();

    mock.Verify(m => m.GetHashCode(), Times.Once());
    Assert.AreEqual(42, hashCode);
}

1 个答案:

答案 0 :(得分:2)

当你创建一个Mock时,它会创建2个内部事物 - Proxy,(由Castle框架生成),它可以强制转换为你的接口,并由Object属性和Interceptor公开,它将根据你拥有的接口注册调用。

在您的方案中,方法GetHashCode不是界面的一部分,当您调用

int hashCode = mock.Object.GetHashCode()

拦截器无法捕获此调用,因为它的配置基于声明的接口。听起来你正在调用代理的GetHashCode而不是你的模拟界面。如果您尝试将GetHashCode方法添加到接口,则将传递测试。