我正在尝试对调用API的函数进行单元测试。我已经使用下面的模拟HttpMessageHandler
成功完成了这个操作,它允许我伪造来自API的响应:
private static Mock<HttpMessageHandler> GetMockHttpMessageHandler(string mockResponse)
{
var mockMessageHandler = new Mock<HttpMessageHandler>();
mockMessageHandler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
.Returns(Task.FromResult(new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent(mockResponse)
}));
return mockMessageHandler;
}
到目前为止,一切顺利。我已经能够测试我的函数的一半,第二个部分会调用另一个API - 然后这两个响应被包装成一个由系统使用的对象。问题是,第二个API需要具有不同的模拟响应。
我认为我可以在上面的代码中更改
ItExpr.IsAny<HttpRequestMessage>()
为 new HttpRequestMessage(HttpMethod.Post, "http://LiveUrl.com/AuthenticateUserCredential")
,然后根据URI使用多个 Setup/Returns
更改响应,但是我尝试了以下内容(只有一个 Setup/Return
以测试是否破坏了第一部分测试)。private static Mock<HttpMessageHandler> GetMockHttpMessageHandler(string mockResponse)
{
var mockMessageHandler = new Mock<HttpMessageHandler>();
mockMessageHandler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", new HttpRequestMessage(HttpMethod.Post, "http://LiveUrl.com/AuthenticateUserCredential"), ItExpr.IsAny<CancellationToken>())
.Returns(Task.FromResult(new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent(mockResponse)
}));
return mockMessageHandler;
}
现在上述问题破坏了第一个 API 调用 - 我收到以下响应:
现在我陷入困境 - 我试图做的事情是否可能?处理程序没有返回响应消息