模拟响应有效,但验证失败

时间:2019-02-07 22:00:15

标签: .net unit-testing mocking moq dotnet-httpclient

我正在尝试使用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次,因为我得到的响应与模拟的响应匹配,因此它似乎起作用了。社区的任何想法都会有所帮助。

1 个答案:

答案 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)