Добавление политики повторных попыток Полли в поддельный HttpClient? - PullRequest
0 голосов
/ 07 марта 2020

Поэтому я должен использовать библиотеку, которая принимает HttpClient и может выдавать исключение регулирования в случае ответа 429 из удаленной системы.

Я хотел бы протестировать политику Polly, которая будет откатываться на запрошенное количество секунд, но я не могу понять, как изменить тест для добавления политики Polly.

Я посмотрел на этот вопрос, но мои обстоятельства другие: Тестирование политики повторных попыток Полли с moq

Вот тест, который проверяет, что исключение выдается. Я хотел бы сделать другую версию с политикой повторения Polly, которая не выдаст.

using Moq;
using Moq.Protected;
using Polly;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

[TestClass]
public class SIGSClientTests
{

    [TestMethod]
    public async Task SigsThrowsOn429()
    {
        var resp = new HttpResponseMessage
        {
            StatusCode = (HttpStatusCode)429,
            Content = new StringContent("{}"),
        };

        resp.Headers.Add("Retry-After", "42");

        var mockMessageHandler = new Mock<HttpMessageHandler>();
        mockMessageHandler.Protected()
            .Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
            .ReturnsAsync(resp);

        var client = new HttpClient(mockMessageHandler.Object);

        // Presumably I can create a Polly retry policy here, and add it to the HttpClient?
        // And then add a 2nd OK response and get rid of the try-catch?

        Uri substrateurl = new Uri("https://substrate.office.com/");
        try {
            await SIGSClient.Instance.PostAsync(client, substrateurl, new UserInfo(), "faketoken", new Signal(), Guid.NewGuid());
        }
        catch (SigsThrottledException e)
        {
            Assert.AreEqual(e.RetryAfterInSeconds, (uint)42);
        }
    }

У меня есть четкое представление о том, как создать политику повторения Polly, но, похоже, все примеры модульных тестов Можно ожидать, что я использую HttpClientFactory для создания клиента, и в этом случае я не уверен, как заставить ЭТО откачивать фиктивный клиент.

1 Ответ

0 голосов
/ 10 марта 2020

Я не могу найти способ внедрить такую ​​политику в HttpClient, если экземпляр HttpClientFactory, поэтому вам придется использовать ее явно, как в этом примере.

...