模拟 HttpClient.SendAsync 以返回内容不为空的响应

Posted

技术标签:

【中文标题】模拟 HttpClient.SendAsync 以返回内容不为空的响应【英文标题】:Mock HttpClient.SendAsync to return response with Content not null 【发布时间】:2021-04-08 13:17:03 【问题描述】:

我正在尝试模拟 var response = await httpClient.SendAsync(request, CancellationToken.None);,但我的 response.Content 始终是 null

我的模拟看起来像......

var httpResponseMessage = new HttpResponseMessage(System.Net.HttpStatusCode.OK);
httpResponseMessage.Content = new StringContent("test content", System.Text.Encoding.UTF8, "application/json");
A.CallTo(() => httpClient.SendAsync(A.Fake<HttpRequestMessage>(), CancellationToken.None)).Returns(Task.FromResult(httpResponseMessage));

它似乎被正确地模拟了,但 response.Content 为空,但状态代码 - 例如 - 反映了我在测试中设置的内容。

我相信你们当中有人遇到过这个问题,我们将不胜感激。谢谢。

【问题讨论】:

因为这不是有效的HttpResponseMessage。如果没有其他东西,它也会丢失一些标题。为什么不创建一个模拟 DelegatingHandler 类?恕我直言,这是最简单的方法 那里有一个非常好的库,专门用于简化对 HttpClient 的模拟。它叫做 WireMock,你应该试一试。 github.com/WireMock-Net/WireMock.Net 【参考方案1】:

SendAsync 的调用可能不匹配。我看到你配置了你的假货来回应

A.CallTo(() => httpClient.SendAsync(A.Fake<HttpRequestMessage>(), CancellationToken.None))

但您的生产代码不太可能传递与您在此处的 A.Fake&lt;HttpRequestMessage&gt;() 参数比较相等的第一个参数。

你是不是想说

A.CallTo(() => httpClient.SendAsync(A<HttpRequestMessage>.Ignored, CancellationToken.None))

(或等同于A&lt;HttpRequestMessage&gt;._)?

您可以在Argument constraints 页面上了解如何匹配参数。具体来说,请参阅如何匹配 Ignoring arguments 子主题中的任何参数。

【讨论】:

谢谢,这正是我忘记了.Ignored

以上是关于模拟 HttpClient.SendAsync 以返回内容不为空的响应的主要内容,如果未能解决你的问题,请参考以下文章

在 HttpClient.SendAsync() 之后无法访问已释放的对象

HttpClient.SendAsync() 未将 JSON 作为字符串发送

HttpClient.SendAsync 不发送请求正文

HttpClient.SendAsync 方法退出而不抛出异常

HttpClient SendAsync

如何从 Httpclient.SendAsync 调用中获取和打印响应