使用Moq验证非虚拟方法

时间:2018-08-16 07:30:52

标签: c# unit-testing mocking moq

我有一个这样的班级:

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:对非虚拟(在VB中可重写)成员的无效验证:d => d.MethodA()。

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

2 个答案:

答案 0 :(得分:0)

这无论如何都行不通,因为您在模拟游戏中调用MethodB()并不是真实的事情。您想模拟MethodA(),但使用MethodB()的实际实现。这称为部分模拟。有关具体操作,请参见Using moq to mock only some methods

答案 1 :(得分:0)

仅当模拟接口时,或者如果它是具体的类并且该方法是虚拟的时,才可以模拟(或验证)方法。

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