Я пытаюсь выполнить модульное тестирование HttpClient с Polly RetryPolicy и пытаюсь выяснить, как управлять ответом HTTP.
Я использовал HttpMessageHandler на клиенте и затем переопределите Send Asyn c, и это прекрасно работает, но когда я добавляю Polly Retry Policy, я должен создать экземпляр Http-клиента с помощью IServiceCollection и не могу создать HttpMessageHandler для клиента. Я попытался использовать .AddHttpMessageHandler()
, но затем он блокирует политику повторных запросов на опрос, и она срабатывает только один раз.
Так я настраиваю свой http-клиент в своем тесте
IServiceCollection services = new ServiceCollection();
const string TestClient = "TestClient";
services.AddHttpClient(name: TestClient)
.AddHttpMessageHandler()
.SetHandlerLifetime(TimeSpan.FromMinutes(5))
.AddPolicyHandler(KYA_GroupService.ProductMessage.ProductMessageHandler.GetRetryPolicy());
HttpClient configuredClient =
services
.BuildServiceProvider()
.GetRequiredService<IHttpClientFactory>()
.CreateClient(TestClient);
public static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
return HttpPolicyExtensions
.HandleTransientHttpError()
.WaitAndRetryAsync(6,
retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
onRetryAsync: OnRetryAsync);
}
private async static Task OnRetryAsync(DelegateResult<HttpResponseMessage> outcome, TimeSpan timespan, int retryCount, Context context)
{
//Log result
}
Это затем вызовет запрос, когда я позвоню _httpClient.SendAsync(httpRequestMessage)
, но он действительно создаст Http-вызов по адресу, и мне нужно перехватить это каким-то образом и вернуть контролируемый ответ.
Я хотел бы проверить, используется ли политика повторить запрос, если запрос завершится неудачно и завершится, когда он получит полный ответ.
Основное ограничение, которое у меня есть, - я не могу использовать Moq на MSTest.