Я пытаюсь протестировать класс, который использует HttpClient, и мне нужно подделать ответ Stream.
Это код, который я пытаюсь проверить.
try
{
_httpClient.Timeout = TimeSpan.FromMinutes(10);
_httpClient.BaseAddress = new Uri(BaseAddress);
_httpClient.DefaultRequestHeaders.Accept.Clear();
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", _credentials);
using (Stream s = _httpClient.GetStreamAsync(API_string).Result) <---- this is the trouble line.
using (StreamReader sr = new StreamReader(s))
using (JsonReader reader = new JsonTextReader(sr))
{
JsonSerializer serializer = new JsonSerializer();
return serializer.Deserialize<T>(reader); //breaks loop
}
}
С тестовой стороны я могу вставить свой собственный HttpClientHandler и отправить обратно любой ответ, какой захочу.
Это мой фальшивый компоновщик HttpClientHandler (я использую Moq).
public HttpClientHandler MockHttpClientHandler()
{
var requestUri = new Uri("Uri.Expected.To.Be.Called");
var expectedResponse = "Response text"; <-- This is where i need to write the Object to be returned.
var mockResponse = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(expectedResponse) };
var mockHandler = new Mock<HttpClientHandler>();
mockHandler
.Protected()
.Setup<Task<HttpResponseMessage>>(
"SendAsync",
ItExpr.Is<HttpRequestMessage>(message => message.RequestUri == requestUri),
// ItExpr.IsAny<HttpRequestMessage>(),
ItExpr.IsAny<CancellationToken>())
.Returns(Task.FromResult(mockResponse));
return mockHandler.Object;
}
Мой тест прерывается, когда он пытается запустить обратную линию, потому что все, что я посылаю обратно, не может быть десериализовано. Я просто не знаю, как должен выглядеть мой Stream, и я не могу увидеть его содержимое при отладке.
Я довольно потерян здесь. Может быть, мой подход неверен?
Спасибо за любую помощь, которую вы можете оказать мне.