我们已经模拟了 HttpMessageHandler
,因此我们可以测试使用 HttpClient
的类。
我们正在测试的方法之一创建一个新的 HttpClient
,调用 PostAsync
,并处置 HttpClient
。我们想测试 HTTP 请求的 Content
,如下所示:
Assert.Equal("", ActualHttpRequestMessage.Content.ReadAsStringAsync());
问题是我们“无法访问已处置的对象”,因为 the HttpClient
disposes the Content
。
问题我们如何检查内容?
这是我们的起订量设置。
MockHttpMessageHandler = new Mock<HttpMessageHandler>();
MockHttpMessageHandler
.Protected()
.Setup<Task<HttpResponseMessage>>(
"SendAsync",
ItExpr.IsAny<HttpRequestMessage>(),
ItExpr.IsAny<CancellationToken>())
.Callback<HttpRequestMessage, CancellationToken>(
(httpRequestMessage, cancellationToken) =>
{
ActualHttpRequestMessage = httpRequestMessage;
})
.Returns(
Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(string.Empty)
}));
这就是我们在测试类中使用它的方式。
new HttpClient(HttpMessageHandler);
最佳答案
将你的模拟更改为:
MockHttpMessageHandler
.Protected()
.Setup<Task<HttpResponseMessage>>(
"SendAsync",
ItExpr.IsAny<HttpRequestMessage>(),
ItExpr.IsAny<CancellationToken>())
.Callback<HttpRequestMessage, CancellationToken>(
(httpRequestMessage, cancellationToken) =>
{
// +++++++++++++++++++++++++++++++++++++++++
// Read the Content here before it's disposed
ActualHttpRequestContent = httpRequestMessage.Content
.ReadAsStringAsync()
.GetAwaiter()
.GetResult();
ActualHttpRequestMessage = httpRequestMessage;
})
.Returns(
Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(string.Empty)
}));
然后你可以这样测试:
Assert.Equal("", ActualHttpRequestContent);
请记住,我们只能读取 Content
一次,因此如果您稍后尝试读取它,它将是空的。它就像一个海森堡物体。
关于asp.net - 调用 PostAsync 后测试 HttpRequestMessage.Content 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41732597/