C# 控件不存在';调试时不要转到虚拟方法
我有一个方法很少的类。对于这些方法,我使用MSTest创建单元测试用例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
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);
}
}