c# - 验证一个方法被调用

标签 c# .net mocking moq verify

使用最小起订量时,我遇到了一个非常奇怪的问题,即模拟设置似乎只有在我设置的方法是公开的情况下才有效。我不知道这是 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/

相关文章:

c# - RhinoMocks 错误 "Only assignment, call, increment, decrement, and new object expressions can be used as a statement"

spring - 使用@WebMvcTest 进行单元测试 POST - @MockBean 服务返回 null

c# - Convert.ChangeType不接受十进制的 "1E-5"科学计数法,如何修复?

C# 如何从 linq2sql 查询返回到 main

c# - 如何在 NSwagStudio 中为 C# 客户端自定义生成的 DTO

c# - 在 .NET 中以编程方式检索断开连接的网络适配器信息

c# - 确定第 3 方应用程序安装目录

c# - Entity Framework ——如何在缩写的 EF linq 中实现这个 SQL

c# - 任何用于 RED5 媒体服务器的 .NET API 或任何其他具有 .NET API 的跨平台媒体服务器?

.net - 您愿意模拟 StreamReader 对象吗?