У меня есть метод, который отправляет параллельные запросы 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?