Это не полностью рабочее решение, это просто часть кода, чтобы вопрос был более понятным и читабельным.
Я прочитал документацию Полли здесь, однако мне действительно нужно проверить, действительно ли следующий делегат TimeoutPolicy onTimeoutAsync
выполняется (также, в случае обертывания TimeoutPolicy вместе с RetryPolicy - сколько TIMES было выполнено) после истечения времени ожидания httpClient:
public static TimeoutPolicy<HttpResponseMessage> TimeoutPolicy
{
get
{
return Policy.TimeoutAsync<HttpResponseMessage>(1, onTimeoutAsync: (context, timeSpan, task) =>
{
Console.WriteLine("Timeout delegate fired after " + timeSpan.TotalMilliseconds);
return Task.CompletedTask;
});
}
}
TimeoutPolicy установлен на тайм-аут через 1 секунду после того, как HTTP-клиент не получил ничего (макет HttpClient задерживается на 4 секунды, как показано ниже)
var httpMessageHandler = new Mock<HttpMessageHandler>();
httpMessageHandler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
.Callback(() => Thread.Sleep(4000))//Delayed here
.Returns(() => Task.FromResult(new HttpResponseMessage
{
StatusCode = HttpStatusCode.InternalServerError,
Content = new StringContent("Some response body", Encoding.UTF8, "text/xml")
}));
var httpClient = new HttpClient(httpMessageHandler.Object);
Политики имитируются, чтобы иметь возможность вызывать .Verify () для Assertion:
var mockedPolicies = new Mock<Policies>();
Я выполняю вызов с фиктивным HTTP-клиентом и фиктивной политикой тайм-аута:
await mockedPolicies.Object.TimeoutPolicy.ExecuteAsync(ct => _httpClient.PostAsync("", new StringContent("Some request body"), ct), CancellationToken.None);
Утверждение:
mockedPolicies.Verify(p => p.TimeoutDelegate(It.IsAny<Context>(), It.IsAny<TimeSpan>(), It.IsAny<Task>()), Times.Exactly(1));
Тем не менее, результат теста говорит, что он был вызван 0 раз вместо 1. Спасибо за любые ответы.