Создать HttpClientFactory по умолчанию для интеграционного теста - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть типизированный клиент, которого я хочу зарегистрировать как синглтон:

public class SomeHttpClient
{
    private readonly IHttpClientFactory _clientFactory;

    public SomeHttpClient(IHttpClientFactory clientFactory)
    {
        _clientFactory = clientFactory;
    }

    public Task MakeSomeCallAsync(...)
    {
        var client = _clientFactory.Create();
        // Do more stuff
    }
}

Типизированный клиент должен быть синглтоном, потому что он имеет некоторую логику прерывателя цепи, которая прерывает цепь, если скорость APIограничение клиента.Схема должна быть разорвана по всему приложению, и, очевидно, не только по текущему конвейеру запросов (в противном случае клиент будет продолжать использовать API, который уже ограничивает скорость по сравнению с другими экземплярами).Это уже реализовано с помощью типизированного клиента, который инкапсулирует эту функциональность (хотя не Polly).

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

Теперь у меня вопрос: как мне создать HttpClientFactory по умолчанию для простого теста функциональной интеграции, в котором я хочу создать экземпляр типизированного клиента и посмотреть, смогу ли я подключиться к API и получить успешный ответ от автоматического теста?

Я не хочу настраивать ASP.NET Core TestServer и целое приложение вокруг него, потому что это лишнее решение для такого рода функционального тестирования, которое я хочу сделать в этом пункте.

Нет общедоступного конструктора, который я мог бы использовать для введения HttpClientFactory?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Теперь у меня вопрос: как я могу создать HttpClientFactory по умолчанию для простого теста функциональной интеграции, где я хочу создать экземпляр типизированного клиента и посмотреть, смогу ли я подключиться к API и получить успешный ответ от автоматического теста?

Ваш тест может принять точный код, который вы используете для настройки HttpClientFactory в StartUp (это пример использования политики Polly, но это может быть любая конфигурация в HttpClientFactory).

IServiceCollection services = new ServiceCollection(); // [1]

services.AddHttpClient(TestClient)
    .AddPolicyHandler(HttpPolicyExtensions.HandleTransientHttpError()
    .RetryAsync(3); // [2]

Строка [2] может быть точным кодом из вашего StartUp класса.Вы можете выделить его из обычного ConfigureServices(...) метода в отдельный метод static, который также может вызывать ваш тест - так что ваш тест проверяет именно то, что настраивает StartUp.

Тогда в тесте просто:

IHttpClientFactory factory = services
    .BuildServiceProvider()
    .GetRequiredService<IHttpClientFactory>();

var sut = new SomeHttpClient(factory);
0 голосов
/ 30 сентября 2018

Я просто создаю один для тестирования (я думал, что, возможно, уже есть метод, который мог бы сделать это для меня):

type DefaultHttpClientFactory() =
    interface IHttpClientFactory with
        member __.CreateClient (name) =
            new HttpClient()
...