Moq Verify() в издеваемом HttpClientHandler не может получить доступ к объекту Content, поскольку он удален.C#

Место общения программистов C#
Ответить
Anonymous
 Moq Verify() в издеваемом HttpClientHandler не может получить доступ к объекту Content, поскольку он удален.

Сообщение Anonymous »

Я делаю макет HttpClient, чтобы можно было выполнить модульное тестирование своего кода. Я хочу проверить публикуемый контент.

Я сделал это:

Код: Выделить всё

MockHttpMessageHandler =  new Mock() { CallBase = true };
HttpClient = new HttpClient(MockHttpMessageHandler.Object, false);
и

Код: Выделить всё

 MockHttpMessageHandler.Setup(c => c.Send(It.IsAny())).Returns(new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
});
и

Код: Выделить всё

MockHttpMessageHandler.Verify(c => c.Send(It.Is(
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 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.ObjectDisposeException: невозможно получить доступ к удаленному объекту.
Имя объекта: 'System.Net.Http.StringContent'.

Это часть m.Content.ReadAsStringAsync().Result, поскольку Content удален.

Подробнее здесь: https://stackoverflow.com/questions/600 ... ject-becau
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»