Можно ли использовать Furl.Http с OWIN TestServer?

Я использую OWIN TestServer, который предоставляет мне HttpClient для выполнения вызовов в памяти на тестовом сервере. Мне интересно, есть ли способ передать в существующий HttpClient для использования Flurl.

1 ответ

Решение

ОБНОВЛЕНИЕ: большая часть информации, приведенной ниже, больше не относится к Flurl.Http 2.x. В частности, большая часть функциональности Flurl содержится в новом FlurlClient объект (который оборачивает HttpClient), а не в пользовательском обработчике сообщений, поэтому вы не потеряете функциональность, если предоставите другой HttpClient, Кроме того, начиная с Flurl.Http 2.3.1, вам больше не нужен собственный завод для этого. Это так же просто, как:

var flurlClient = new FlurlClient(httpClient);

Flurl обеспечивает IHttpClientFactory интерфейс, который позволяет настроить HttpClient строительство. Тем не менее, большая часть функциональности Flurl предоставляется на заказ HttpMessageHandler, который добавляется к HttpClient на строительстве. Вы не хотели бы горячей замены его для уже созданного HttpClient или вы рискуете сломить Flurl.

К счастью, OWIN TestServer также управляется HttpMessageHandlerи вы можете передать несколько, когда вы создаете HttpClient,

Начните с пользовательской фабрики, которая позволяет вам передать TestServer пример:

using Flurl.Http.Configuration;
using Microsoft.Owin.Testing;

public class OwinTestHttpClientFactory : DefaultHttpClientFactory
{
    private readonly TestServer _testServer;

    public OwinTestHttpClientFactory(TestServer server) {
        _testServer = server;
    }

    public override HttpMessageHandler CreateMessageHandler() {
        // TestServer's HttpMessageHandler will be added to the end of the pipeline
        return _testServer.Handler;
    }
}

Фабрики могут быть зарегистрированы во всем мире, но так как вам нужно другое TestServer экземпляр для каждого теста, я бы рекомендовал установить его на FlurlClient экземпляр, который является новой возможностью с Flurl.Http 0.7. Итак, ваши тесты будут выглядеть примерно так:

using (var testServer = TestServer.Create(...)) {
    using (var flurlClient = new FlurlClient()) {
        flurlClient.Settings.HttpClientFactory = new OwinTestHttpClientFactory(testServer);

        // do your tests with the FlurlClient instance. 2 ways to do that:
        url.WithClient(flurlClient).PostJsonAsync(...);
        flurlClient.WithUrl(url).PostJsonAsync(...);
    }
}
Другие вопросы по тегам