Как смоделировать несколько вызовов httpclient в одном методе? - PullRequest
0 голосов
/ 21 марта 2019

У меня есть метод, который отправляет параллельные запросы http, как это:

    public async Task<string> GetEmails(string userName)
    {
        var source1Response = GetFromSource1(userName);
        var source2Response = GetFromSource2t(userName);

        await Task.WhenAll(source1Response, source2Response);
        var data1 = await source1Response;
        var data2 = await source2Response;
        return data1 + "," + data2;           
    }

    private async Task<string> GetFromSource1(string userName)
    {
        var url = "url to source 1";
        return await SendRequest(url, new { username = userName });
    }

    private async Task<string> GetFromSource2(string userName)
    {
        var url = "url to source 2";
        return await SendRequest(url, new { username = userName });
    }

    private async Task<string> SendRequest(string url, object json)
    {
        var uri = new Uri(string.Format(baseUrl)) + url;
        var request = new HttpRequestMessage(HttpMethod.Post, uri);
        request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        request.Headers.Add("Authorization, "token");
        string jsonString = JsonConvert.SerializeObject(json);
        request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");
        var response = await _httpClient.SendAsync(request);
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadAsAsync<string>();
    }

Теперь я хочу написать модульный тест для метода GetEmails (), но проблема в том, что я получаю ложный ответ в случае 1 вызова, но во втором вызове я получаю нулевое значение. Вот макет для httpClient:

        var expectedResponse = JsonConvert.SerializeObject("dummy1@example.com");
        var mockResponse =
            new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(expectedResponse) };
        mockResponse.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        var mockHandler = new Mock<DelegatingHandler>();
        mockHandler
            .Protected()
            .Setup<Task<HttpResponseMessage>>(
                "SendAsync",
                ItExpr.Is<HttpRequestMessage>(
                    message => message.Headers.Contains("Authorization")
                               && message.Headers.Authorization.Scheme.Equals("Bearer")
                               && message.RequestUri.AbsoluteUri.Contains(string.Format("https://dummyUrl.com"))
                ),
                ItExpr.IsAny<CancellationToken>())
            .Returns(Task.FromResult(mockResponse));

        var httpClient = new HttpClient(mockHandler.Object);

Теперь в случае метода GetFromSource1 () я получаю «dummy1@example.com», но в случае GetFromSource2 я получаю нулевое значение. Так как же создать макет для GetFromSource2? Могу ли я добавить некоторые методы возврата в методе DelegatingHandler?

...