Мы издевались над HttpMessageHandler
, поэтому мы можем протестировать класс, который использует HttpClient
.Проверьте значение HttpRequestMessage.Content после вызова PostAsync
Один из наших тестируемых методов создает новый HttpClient
, вызывает PostAsync
и располагает HttpClient
. Мы хотели бы, чтобы проверить Content
запроса HTTP, как это:
Assert.Equal("", ActualHttpRequestMessage.Content.ReadAsStringAsync());
Проблема заключается в том, что мы «не удается получить доступ к объекту, расположенную,» потому что the HttpClient
disposes the Content
.
Вопрос Как мы можем проверить содержание?
Это наша установка Moq.
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);
Я не буду добавлять это в качестве ответа, так как это моя собственная библиотека, но вы посмотрели на [MockHttp] (https://github.com/richardszalay/mockhttp)? Он обеспечивает более приятную DSL для издевательских запросов HttpClient по сравнению с динамичной насмешливой библиотекой, такой как Moq. –