如何编写异步泛型方法的模拟实现

How to write mock implementation of async generic method

我正在为我的服务编写单元测试 class 但它调用外部 WCF 服务,因此需要模拟此调用。这是外部WCF服务调用的包装接口。

internal interface IKoopServiceRequestHelper
{
Task<ServiceResponseDTO> CreateRequestAsync(ServiceRequestDTO serviceRequestDTO);

Task<TResponse> SendServiceMessagesAsync<TRequest, TResponse>(TRequest request, string messageCode)
    where TRequest : RequestDTO
    where TResponse : IResponseDTO;
}

为了模拟此接口的实际实现,我编写了一个存根 class,如下所示。

 class StubRequestHelper : IKoopServiceRequestHelper
{
    public async Task<ServiceResponseDTO> CreateRequestAsync(ServiceRequestDTO serviceRequestDTO)
    {
        return await Task.FromResult(new ServiceResponseDTO());
    }
}

但是我无法编写名为 SendServiceMessagesAsync 的第二个方法的模拟实现,该方法具有两个泛型类型参数。

尝试使用 moq。假设是,为了满足约束条件:

  • ServiceRequestDTO : RequestDTO
  • ServiceResponseDTO : IResponseDTO

使用moq应该相当简单

var mock = new Mock<IKoopServiceRequestHelper>();
mock.Setup(m => m.CreateRequestAsync(It.IsAny<ServiceRequestDTO>()))
    .Returns(Task.FromResult(new ServiceResponseDTO()));
mock.Setup(m => m.SendServiceMessagesAsync<ServiceRequestDTO, ServiceResponseDTO>(It.IsAny<ServiceRequestDTO>(), It.IsAny<string>()))
    .Returns(Task.FromResult(new ServiceResponseDTO()));