c# - 使用通用接口和方法模拟**类**
问题描述
我必须在一个类中模拟一个模板方法。我正在为遗留代码编写测试,无法更改代码。
界面如下:
public interface ICommand<in I, out O>
{
O Execute(I input);
}
实施:
public class GetCaseCommand : ICommand<string, Task<EsdhCaseResponseDto>>
{
public Task<EsdhCaseResponseDto> Execute(string input)
{
return ExecuteInternal(input);
}
}
我必须从类中模拟该方法,因为(的模拟)该类必须是另一个类的构造函数参数,该类将不接受接口。
我试过这个测试:
var mockGetCaseCommand =
new Mock<GetCaseCommand>(mockCommandGetLogger.Object, mockedEsdhService.Object);
mockGetCaseCommand.Setup(mGC => mGC.Execute(It.IsAny<string>()))
.Returns(Task.FromResult<EsdhCaseResponseDto>(new EsdhCaseResponseDto()
{
Title = "Title",
CaseId = "123456"
}));
并得到异常:
System.NotSupportedException:'不支持的表达式:mGC => mGC.Execute(It.IsAny()) 不可覆盖的成员(这里:GetCaseCommand.Execute)不能用于设置/验证表达式。'
我试图找到其他方法来创建安装程序。但是上面的那个是我唯一可以编译的。
有什么建议么?
解决方案
单元测试是一种手段,而不是目标。
如果更改遗留代码是毫无疑问的,您应该接受这样一个事实,即您的父类不是纯粹可测试的,并将GetCaseCommand
其视为内部行为。
可以帮助您保持高度的单元可测试性的是制作我所说的“二级模拟”,即 mockGetCaseCommand
的依赖项(记录器、服务),从您的代码片段中我推断它们被表示为接口。
如果二级模拟也不可能 - 只需进行集成测试。
推荐阅读
- javascript - 使用ajax添加数据后dataTable的行消失
- pandas - 如何从看起来像 Pandas 中的字典的列中提取数据?
- c - 一起使用二进制信号量和互斥量
- facebook-graph-api - 获取 facebook 帐户账单信息的 API
- ios - 为什么网络库无法检测到互联网何时在 Swift Ios 中重新连接
- node.js - nodejs spotify web api无法使用access_token进行身份验证
- dataset - 如何识别表示整个数据集的数据集子集?
- c - 文件溢出到分配的内存 C
- android - 如何删除微调器中的右侧间距或填充?
- reactjs - 当我使用 Lifting State Up 时,useState(false) 不起作用