我正在尝试使用Moq在单元测试中模拟HTTP响应。我已经按照以下步骤设置了我的模拟游戏:
var mockHandler = new Mock<HttpMessageHandler>(MockBehavior.Strict);
mockHandler
.Protected()
// Sets up mock for the protected SendAsync method
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
// Prepare the expected response of the mocked HTTP call
.ReturnsAsync(new HttpResponseMessage() { StatusCode = System.Net.HttpStatusCode.OK, Content = new StringContent("{\"stuff\":[\""+expectedstuff+"\"]}"), })
.Verifiable();
然后我创建httpclient:
var client = new HttpClient(mockHandler.Object)
{
BaseAddress = new Uri(expectedRequestUri),
};
然后我将其发布到客户端:
var response = await client.PostAsync("/path", new StringContent(""));
当我反序列化响应时,它与我在上面的“设置”步骤中设置的模拟响应完全匹配,并且一切正常。但是,在最后一步中,我遇到了一个引发异常的问题(如下)……
mockHandler
.Protected()
.Verify(
"SendAsync",
Times.Exactly(1),
ItExpr.Is<HttpRequestMessage>(request => request.Method == HttpMethod.Post && request.RequestUri == new Uri(expectedRequestUri)),
ItExpr.IsAny<CancellationToken>());
错误:
Moq.MockException:预期对该模拟调用恰好1次,但实际上是0次:
mock => mock.SendAsync(It.Is<HttpRequestMessage>(request => request.Method == HttpMethod.Post && request.RequestUri == new Uri(.expectedRequestUri)), It.IsAny<CancellationToken>())
我不知道为什么它报告0次,因为我得到的响应与模拟的响应匹配,因此它似乎起作用了。社区的任何想法都会有所帮助。
答案 0 :(得分:2)
在这种情况下,您必须检查Verify
中使用的表达式。
它显然与调用的内容不匹配。
如果客户端的基址为expectedRequestUri
var client = new HttpClient(mockHandler.Object)
{
BaseAddress = new Uri(expectedRequestUri), //<--
};
该帖子使用/path
var response = await client.PostAsync("/path", new StringContent("")); //<--
然后,请求网址将是两者的组合。
但是在验证中,您检查
request.RequestUri == new Uri(expectedRequestUri)