C# 控件不存在';调试时不要转到虚拟方法

C# 控件不存在';调试时不要转到虚拟方法,c#,unit-testing,moq,virtual,mstest,C#,Unit Testing,Moq,Virtual,Mstest,我有一个方法很少的类。对于这些方法,我使用MSTest创建单元测试用例 public class Class1 { public virtual async Task<bool> GetData() { string var1 ="dsfs", var2 ="eer"; bool retVal = await DoSomething(var1, var2); // some business logic

我有一个方法很少的类。对于这些方法,我使用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;
    }
}
现在,我面临的问题是

var result = await mockService.Object.GetData();
从此行开始,控件不会转到
Class1
中的实际
GetData()
方法。如果我从方法定义中删除
virtual
关键字,那么控件将转到该方法,即,如果我将该方法设置为这样

public async Task<bool> GetData()
{
    bool retVal = await DoSomething(var1, var2);
    // some business logic
    return true;
}
公共异步任务GetData() { bool retVal=等待剂量测定(var1,var2); //一些商业逻辑 返回true; } 我需要使这个方法虚拟化,因为这个方法是在其他方法中调用的,比如“
XYZMethod
”,为了编写测试用例“XYZMethod”,我在那里模拟了
GetData()
方法

所以,无论如何,我可以解决这个问题,而不删除虚拟关键字


PS:编写接口不是一个选项,因为这是一个非常繁重的代码,我正在编写,在这个阶段引入接口是不实际的

在mock上启用
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);
    }
}
[TestClass()]
公开班级考试{
[TestMethod()]
公共异步任务GetDataTest(){
//安排
var mockService=new Mock(){
CallBase=true
};
var expected=ReturnTrue();//此函数返回true
模拟服务
.Setup(x=>x.DoSomething(It.IsAny(),It.IsAny())
.ReturnsAsync(预期);
//表演
var actual=await mockService.Object.GetData();
//断言
断言.IsTrue(实际);
}
}

在mock上启用
CallBase
,以便调用未被设置覆盖的基本方法。请详细说明您所说的内容。
[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);
    }
}