c# - 调试时控制不转到虚拟方法
问题描述
我有一堂课,方法很少。对于这些方法,我正在使用 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:编写接口不是一种选择,因为这是我正在处理的非常繁重的代码,并且在这个阶段引入接口是不切实际的。
解决方案
在模拟上启用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);
}
}
推荐阅读
- html - 根元素不会将其显示更改为内联
- javascript - 一个简单的 Node.js 应用程序的项目结构应该是什么样的?
- python - 检查多个列都是 zeor
- python - 无法在 Django 模板中显示值
- random - 具有给定均值和标准差的正随机数生成
- javascript - ngOnInit Angular 之后来自@Input 的值无效
- java - 可以修改 BFS 以搜索具有负加权边的图吗?
- java - 使Android通知栏透明而不是底部导航栏
- google-kubernetes-engine - GKE Kong 代理获得 502
- amazon-web-services - 如何增加 EC2 Linux + 联网 ECS 集群中的实例数量