首页 > 解决方案 > 调试时控制不转到虚拟方法

问题描述

我有一堂课,方法很少。对于这些方法,我正在使用 MSTest 创建单元测试用例。

public class Class1
{
    public virtual async Task<bool> GetData()
    {
        string var1 ="dsfs", var2 ="eer";
        bool retVal = await DoSomething(var1, var2);
        // some business logic
        return true;
    }
    public virtual async Task<bool> DoSomething(string var1, string var2)
    {
        return true;
    }
}

方法的测试用例GetData()如下所示。

[TestClass()]
public class Class1Test
{
    [TestMethod()]
    public async Task GetDataTest()
    {
        var mockService = new Mock<Class1>();
        var isTrue = ReturnTrue(); // this function returns true
        mockService.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<string>())).Returns(isTrue);
        var result = await mockService.Object.GetData();
        Assert.IsTrue(result);
    }
}

现在,我面临的问题是,

var result = await mockService.Object.GetData();

从这一行开始,控件不会转到GetData(). Class1如果我virtual从方法定义中删除关键字,则控制转到方法,即,如果我像这样创建方法。

public async Task<bool> GetData()
{
    bool retVal = await DoSomething(var1, var2);
    // some business logic
    return true;
}

我需要使这个方法虚拟,因为这个方法在其他方法中被调用,比如“ XYZMethod”,并且为了编写测试用例“XYZMethod”,我在GetData()那里模拟了方法。

那么无论如何我可以在不删除虚拟关键字的情况下解决这个问题。

PS:编写接口不是一种选择,因为这是我正在处理的非常繁重的代码,并且在这个阶段引入接口是不切实际的。

标签: c#unit-testingmoqvirtualmstest

解决方案


在模拟上启用CallBase,以便它将调用尚未被设置期望覆盖的基本成员。

也用于ReturnsAsync配置异步模拟成员以允许它们在调用时正确流动。

[TestClass()]
public class Class1Test {
    [TestMethod()]
    public async Task GetDataTest() {
        //Arrange
        var mockService = new Mock<Class1>(){
            CallBase = true
        };
        var expected = ReturnTrue(); // this function returns true
        mockService
            .Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<string>()))
            .ReturnsAsync(expected);

        //Act
        var actual = await mockService.Object.GetData();

        //Assert
        Assert.IsTrue(actual);
    }
}

推荐阅读