首页 > 解决方案 > 使用通用接口和方法模拟**类**

问题描述

我必须在一个类中模拟一个模板方法。我正在为遗留代码编写测试,无法更改代码。

界面如下:

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)不能用于设置/验证表达式。'

我试图找到其他方法来创建安装程序。但是上面的那个是我唯一可以编译的。

有什么建议么?

标签: c#unit-testinggenericsmockingmoq

解决方案


单元测试是一种手段,而不是目标。

如果更改遗留代码是毫无疑问的,您应该接受这样一个事实,即您的父类不是纯粹可测试的,并将GetCaseCommand其视为内部行为。

可以帮助您保持高度的单元可测试性的是制作我所说的“二级模拟”,即 mockGetCaseCommand的依赖项(记录器、服务),从您的代码片段中我推断它们被表示为接口。

如果二级模拟也不可能 - 只需进行集成测试。


推荐阅读