2012-05-04 21 views
9

Mam test integracji, który chciałem wykorzystać jako podstawę do testowania moich kontrolerów WebAPI.HttpClient z asp.net WebApi w scenariuszu testowania jednostkowego

Początkowo myślałem, że będę musiał skonfigurować WebAPI w trybie self-host i przeprowadzić testy end-to-end na lokalnym Http.

Jednak później zdałem sobie sprawę, patrząc na testy w projekcie WebApiContrib, że możliwe jest ustawienie HttpClient z konfiguracją HttpServer z poprawną trasą usługi do kontrolera WebAPI. Wydaje mi się, że mogę testować jednostki kontrolerów bez ustawienia WebApi w trybie hosta. Mogę umieścić dowolną nazwę domeny w żądaniu na kliencie, a HttpClient wydaje się automatycznie wiązać do odpowiedniego kontrolera.

Czy dzieje się tutaj przenoszenie HTTP, używając lokalnych komunikatów międzyprocesowych lub "widząc", że serwer znajduje się w tej samej domenie aplikacji i używa w ten sposób refleksji? Co się dzieje pod maską, aby tak się stało? Kod

:

[Test] 
public void Test_WebApi_Controller() 
{ 
    Assembly.Load("myproj.Web"); 

    var prodServiceMock = new Mock<IProductService>(); 
    ObjectFactory.Initialize(x => x.For<IProductService>().Use(prodServiceMock.Object));      

    var config = new HttpConfiguration(); 
    config.Routes.MapHttpRoute("default", "webapi/{controller}/{id}", new { id = RouteParameter.Optional }); 
    config.ServiceResolver.SetResolver(new WebApiDependencyResolver()); 

    var server = new HttpServer(config); 
    var client = new HttpClient(server); 

    var response = client.GetAsync("http://anything.com/webapi/product").Result; 

} 

Odpowiedz

9

HttpClient ma podłączany modelu rurociągu. Zwykle po dodaniu HttpClient otrzymujesz instancję HttpClientHandler jako domyślny procesor żądań. Ten HttpClientHandler jest tym, który faktycznie wykonuje HttpWebRequest. HttpClientHandler pochodzi z HttpMessageHandler.

Przez brak zgodności HttpServer również pochodzi z HttpMessageHandler. W tym przykładzie serwer HttpServer jest przekazywany do instancji HttpClient, aby zapewnić przetwarzanie żądań. Przekazując HttpMessageHandler do konstruktora HttpClient, mówisz HttpClient, aby użył dostarczonego programu obsługi zamiast domyślnego. Jeśli spojrzysz na WebRequestHandler w System.Net.Http.WebRequest zobaczysz, że to pochodzi od HttpClientHandler i dodaje kilka dodatkowych funkcji, które są specyficzne dla Windows Desktop OS.

Oznacza to, że po wysłaniu żądania do HTTPClient jest on dostarczany bezpośrednio do obsługi komunikatów HttpServer, a następnie przetwarzany tak jak zwykle na serwerze.

+0

Skąd wiadomo, jak nawiązać bezpośrednie połączenie z przewodnikiem? Czy HttpServer również nie jest używany do połączeń sieciowych? – jaffa

+0

@jaffa HttpClient wysyła wszystkie żądania do HttpMessageHandler, który został mu dostarczony. HttpServer znajduje się na hoście, który obsługuje wszystkie funkcje sieciowe. Albo IIS, samodzielny host WCF, albo inny host Owin. –

Powiązane problemy