2012-05-04 5 views
9

Ich habe einen Integrationstest, den ich als Basis für das Testen meiner WebAPI-Controller verwenden wollte.HttpClient mit asp.net WebApi im Unit-Test-Szenario

Anfangs dachte ich, ich würde WebAPI in Selbst Host-Modus und Getränke zum Mitnehmen End-to-End-Tests über lokale Http Set-up haben.

Allerdings erkannte ich später bei den Tests im WebApiContrib-Projekt, dass es möglich ist, einen HttpClient mit einer HttpServer-Einrichtung mit der richtigen Service-Route zum WebAPI-Controller einzurichten. Ich glaube, ich kann die Controller testen, ohne WebApi im Self-Host-Modus einzurichten. Ich kann jeden Domain-Namen in die Anfrage auf dem Client eingeben und HttpClient scheint sich automatisch an den richtigen Controller zu binden.

Gibt es einen Http Transport hier geschieht, einig lokal Inter Comms mit oder rein ‚sehen‘, dass der Server in der gleichen Anwendungsdomäne ist und somit Reflexion verwendet? Was geschieht unter der Haube, damit dies geschieht?

Code:

[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; 

} 

Antwort

9

Httpclient weist eine steckbare Rohrleitungsmodell. Wenn Sie einen HttpClient neu erstellen, erhalten Sie normalerweise eine HttpClientHandler-Instanz als Standardanforderungsprozessor. Dieser HttpClientHandler ist derjenige, der tatsächlich die HttpWebRequest ausführt. HttpClientHandler wird von HttpMessageHandler abgeleitet.

Auf keinen concidence Httpserver leitet sich auch aus HttpMessageHandler. In diesem Beispiel wird der HttpServer an die HttpClient-Instanz übergeben, um die Anfrageverarbeitung zu ermöglichen. Wenn Sie einen HttpMessageHandler an den Konstruktor von HttpClient übergeben, geben Sie HttpClient an, den bereitgestellten Handler anstelle des Standardhandlers zu verwenden. Wenn Sie bei WebRequestHandler in System.Net.Http.WebRequest sehen sehen Sie dies von HttpClientHandler abgeleitet und fügt einige zusätzliche Funktionen, die auf dem Windows-Desktop OS spezifisch ist.

Das bedeutet, wenn Sie eine Anfrage an die Httpclient machen, ist es direkt an die Httpserver-Meldungshandler geliefert und dann verarbeitet, wie es in der Regel auf dem Server sein würde.

+0

So wie weiß es, wie an den Handler den direkten Aufruf zu machen? Wird HttpServer nicht auch für Netzwerkverbindungen verwendet? – jaffa

+0

@jaffa Der HttpClient sendet alle Anfragen an den HttpMessageHandler, der ihm zur Verfügung gestellt wurde. HttpServer befindet sich auf einem Host, der alle Netzwerkressourcen verarbeitet. Entweder IIS, WCF Self Host oder ein anderer Owin-Host. –