2012-05-04 14 views
9

Ho un test di integrazione che volevo utilizzare come base per testare i miei controller WebAPI con.HttpClient con asp.net WebApi nello scenario di test di unità

Inizialmente pensavo di dover configurare WebAPI in modalità self-host ed eseguire test end-to-end su Http locale.

Tuttavia mi sono reso conto in seguito osservando i test nel progetto WebApiContrib che è possibile impostare un HttpClient con un HttpServer impostato con la corretta route di servizio al controller WebAPI. Mi sembra di poter testare i controller senza configurare WebApi in modalità self-host. Posso inserire qualsiasi nome di dominio nella richiesta sul client e HttpClient sembra associarsi automaticamente al controller corretto.

C'è qualche trasporto Http che si verifica qui, utilizzando alcune comunicazioni interprocessuali locali o semplicemente "vedendo" che il server si trova nello stesso dominio dell'app e quindi utilizzando la riflessione? Che cosa sta succedendo sotto il cofano affinché ciò accada? Codice

:

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

} 

risposta

9

HttpClient ha un modello di condotta pluggable. Normalmente quando si crea un HttpClient si ottiene un'istanza HttpClientHandler come processore di richiesta predefinito. Quello HttpClientHandler è quello che fa effettivamente HttpWebRequest. HttpClientHandler deriva da HttpMessageHandler.

Non concettualmente HttpServer deriva anche da HttpMessageHandler. Quindi in questo esempio HttpServer viene passato all'istanza HttpClient per fornire l'elaborazione della richiesta. Passando HttpMessageHandler al costruttore di HttpClient, stai dicendo a HttpClient di usare il gestore fornito al posto di quello predefinito. Se si guarda WebRequestHandler in System.Net.Http.WebRequest, si vedrà che questo è derivato da HttpClientHandler e aggiunge alcune funzionalità aggiuntive specifiche per il sistema operativo del desktop di Windows.

Ciò significa che quando si effettua una richiesta a HTTPClient viene recapitato direttamente al gestore di messaggi HttpServer e quindi elaborato normalmente sul server.

+0

Quindi, come fa a sapere come effettuare la chiamata diretta al gestore? HttpServer non è utilizzato anche per le connessioni di rete? – jaffa

+0

@jaffa HttpClient invia tutte le richieste a HttpMessageHandler che gli è stata fornita. HttpServer si trova su un host che gestisce tutte le cose di networking. IIS, Self-host WCF o qualche altro host Owin. –

Problemi correlati