Я делаю макет HttpClient, чтобы я мог тестировать мой код модулем. Я хочу проверить содержимое, которое публикуется.
Я сделал это:
MockHttpMessageHandler = new Mock<FakeHttpMessageHandler>() { CallBase = true };
HttpClient = new HttpClient(MockHttpMessageHandler.Object, false);
и
MockHttpMessageHandler.Setup(c => c.Send(It.IsAny<HttpRequestMessage>())).Returns(new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
});
и
MockHttpMessageHandler.Verify(c => c.Send(It.Is<HttpRequestMessage>(
m => m.Content.Headers.ContentType.MediaType == "text/xml" &&
m.Method == HttpMethod.Post &&
m.RequestUri.ToString() == "http://www.test.com/" &&
m.Content.ReadAsStringAsync().Result == "TestContent")));
Это прекрасно работает, за исключением строки Content
. Я получаю сообщение об ошибке, в котором говорится, что Контент удален.
Я предполагаю, что это потому, что это поток.
Есть ли элегантный способ проверить Контент? Было бы неплохо получить прямой доступ к контенту, потому что я могу также проверить наличие проблем с кодированием.
Редактировать:
HttpClient - это зависимость, внедренная в класс, который делает это:
public class MyHttpSenderClass
{
HttpClient _httpClient; // DI populates this
//...
public async Task<HttpResponseMessage> ComposeAndsendHttpRequestMessage(string url, string payload, string mediaType, string method)
{ var httpRequestMessage = new HttpRequestMessage(method, new Uri(url));
httpRequestMessage.Content = new StringContent(payload);
httpRequestMessage.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
using (_httpClient)
{
// I want to test this httpRequestMessage is correct
var responseMessage = await _httpClient.SendAsync(httpRequestMessage);
return responseMessage;
}
}
}
Исключение, для пояснения:
System.ObjectDisposedException: Невозможно получить доступ к удаленному объекту. Имя объекта: 'System. Net .Http.StringContent'.
Это часть m.Content.ReadAsStringAsync().Result
, поскольку Контент удаляется.