使用最小起订量时,我遇到了一个非常奇怪的问题,即模拟设置似乎只有在我设置的方法是公开的情况下才有效。我不知道这是 Moq 错误还是我只是有这个错误(Moq 新手)。这是测试用例:
public class TestClass
{
public string Say()
{
return Hello();
}
internal virtual string Hello()
{
return "";
}
}
[TestMethod]
public void Say_WhenPublic_CallsHello()
{
Mock<TestClass> mock = new Mock<TestClass>();
mock.Setup(x => x.Hello()).Returns("Hello World");
string result = mock.Object.Say();
mock.Verify(x => x.Hello(), Times.Exactly(1));
Assert.AreEqual("Hello World", result);
}
失败并显示此消息:
Say_WhenPublic_CallsHello failed: Moq.MockException: Invocation was not performed on the mock 1 times: x => x.Hello() at Moq.Mock.ThrowVerifyException(IProxyCall expected, Expression expression, Times times)...
如果我像这样公开 Hello 方法,则测试通过。这里有什么问题?
public virtual string Hello()
{
return "";
}
提前致谢!
最佳答案
当 Hello()
是内部的时,测试失败,因为在这种情况下,Moq 无法提供方法的覆盖。这意味着 Hello()
的内部实现将运行,而不是 mock 的版本,从而导致 Verify()
失败。
顺便说一下,您在这里所做的事情在单元测试的上下文中毫无意义。单元测试不应该关心 Say()
调用内部 Hello()
方法。这是程序集内部的实现,与使用代码无关。
关于c# - 验证一个方法被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1980108/