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;
}
So wie weiß es, wie an den Handler den direkten Aufruf zu machen? Wird HttpServer nicht auch für Netzwerkverbindungen verwendet? – jaffa
@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. –