Можно ли использовать 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(...);
}
}