如何编写异步泛型方法的模拟实现
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()));
我正在为我的服务编写单元测试 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()));