调试时控件不会转到虚方法
Control doesn't go to the virtual method while debugging
我有一个 class,方法很少。对于这些方法,我正在使用 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();
从这一行开始,控件不会转到 Class1
中的实际 GetData()
方法。如果我从方法定义中删除 virtual
关键字,那么控制将转到该方法,即,如果我像这样制作方法。
public async Task<bool> GetData()
{
bool retVal = await DoSomething(var1, var2);
// some business logic
return true;
}
我需要使这个方法成为虚拟方法,因为这个方法在其他一些方法中被调用,比如“XYZMethod
”,为了编写测试用例 "XYZMethod",我模拟了 GetData()
方法那里。
那么有没有办法不用删除 virtual 关键字就可以解决这个问题。
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);
}
}
我有一个 class,方法很少。对于这些方法,我正在使用 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();
从这一行开始,控件不会转到 Class1
中的实际 GetData()
方法。如果我从方法定义中删除 virtual
关键字,那么控制将转到该方法,即,如果我像这样制作方法。
public async Task<bool> GetData()
{
bool retVal = await DoSomething(var1, var2);
// some business logic
return true;
}
我需要使这个方法成为虚拟方法,因为这个方法在其他一些方法中被调用,比如“XYZMethod
”,为了编写测试用例 "XYZMethod",我模拟了 GetData()
方法那里。
那么有没有办法不用删除 virtual 关键字就可以解决这个问题。
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);
}
}