Как смоделировать ответ Stream при вызове HttpClient GetStreamAsync - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь протестировать класс, который использует 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, и я не могу увидеть его содержимое при отладке.

Я довольно потерян здесь. Может быть, мой подход неверен?

Спасибо за любую помощь, которую вы можете оказать мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...