Пользовательский метод FailedOperation()
не включает в себя какую-либо связанную инфраструктуру .NET Framework /ASP.NET, поэтому выполнение кода, которое вы тестируете, не будет магическим образом преобразовываться:
throw new HttpResponseException(HttpStatusCode.GatewayTimeout);
до HttpResponseMessage
с StatusCode
. Полли также не делает этого (Полли является общим для любого выполнения делегата, не привязанным к http-выполнению). Метод FailedOperation()
, который вы опубликовали, просто создает HttpResponseException
, чистый и простой.
Политика не объявлена для обработки HttpResponseException
, поэтому она не обрабатывает ее. Добавить предложение .Or<HttpResponseException>()
как это:
var retryPolicy = Policy
.HandleResult<HttpResponseMessage>(r => /* etc */)
.Or<HttpResponseException>();
и политика должна обработать это и заставить тестовый код вести себя так, как я думаю, что вопрос ожидает. В качестве альтернативы, вы можете изменить FailedOperation()
, чтобы он возвращал HttpResponseMessage
с HttpStatusCode
, который обрабатывает политика, и снова тестовый код должен работать так, как ожидалось.
Наконец, если политика должна защищать асинхронные вызовы через HttpClient
, вы захотите использовать асинхронные варианты политик , так как Примеры readme Polly для вызовов Http предполагают .