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;
}
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
@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. –