【问题标题】:Verify non-virtual method with Moq使用 Moq 验证非虚拟方法
【发布时间】:2018-08-16 07:30:51
【问题描述】:

我有这样的课:

public class MyClass
{
    public async Task MethodA()
    {
        await DoSomething();
    }

    public Task MethodB()
    {
        return MethodA();
    }
}

我需要测试 MethodB 调用 MethodA。

但是我该如何验证呢?

我正在尝试这个:

var myClassMock = new Mock<MyClass>();
myClassMock.VerifyAll();
await myClassMock.Object.MethodB();

myClassMock.Verify(d => d.MethodA(), Times.Once);

并且得到 NotSupportedException: Invalid verify on a non-virtual (overridable in VB) member: d => d.MethodA()。

我可以在不使用其他模拟框架的情况下实际测试它吗?

【问题讨论】:

    标签: c# .net unit-testing mocking moq


    【解决方案1】:

    只有在模拟一个接口,或者它是一个具体的类并且方法是虚拟的时,才能模拟(或验证)一个方法。

    DoSomething() 是否依赖任何依赖项?如果没有,您可以在没有 Moq 的情况下对您的课程进行单元测试。如果是这样,您可以模拟这些依赖项并在那里进行验证。

    【讨论】:

      【解决方案2】:

      这无论如何都行不通,因为您在模拟上调用MethodB() 而不是真实的东西。您想模拟MethodA(),但使用MethodB() 的真实实现。这称为部分模拟。请参阅Using moq to mock only some methods 了解如何执行此操作。

      【讨论】:

      • 链接问题描述了不同的情况。无论如何,我决定将 MethodA 设为虚拟会更容易。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多