2012-05-04 3 views
9

WebAPI 컨트롤러를 테스트하기위한 기초로 사용하려는 통합 테스트가 있습니다.단위 테스트 시나리오에서 asp.net WebApi를 사용하는 HttpClient

처음에는 자체 호스트 모드에서 WebAPI를 설정하고 로컬 HTTP를 통해 엔드 투 엔드 테스트를 수행해야한다고 생각했습니다.

그러나 나중에 WebApiContrib 프로젝트의 테스트를 통해 WebAPI 컨트롤러에 대한 올바른 서비스 경로로 HttpServer를 설정하여 HttpClient를 설정할 수 있음을 알았습니다. 자체 호스트 모드에서 WebApi를 설정하지 않고 컨트롤러를 테스트 할 수있는 것 같습니다. 클라이언트의 요청에 도메인 이름을 넣을 수 있으며 HttpClient는 자동으로 올바른 컨트롤러에 바인딩하는 것처럼 보입니다.

일부 로컬 프로세스 통신을 사용하거나 서버가 동일한 앱 도메인에 있으므로 리플렉션을 사용한다는 '보기'가 발생하여 HTTP 전송이 여기에서 발생합니까? 후드에서 무슨 일이 일어나고 있습니까?

코드 :

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

} 

답변

9

HttpClient를은 플러그 파이프 라인 모델을 가지고있다. 일반적으로 HttpClient를 새로 만들 때 HttpClientHandler 인스턴스를 기본 요청 프로세서로 가져옵니다. HttpClientHandler가 실제로 HttpWebRequest를 수행하는 HttpClientHandler입니다. HttpClientHandler는 HttpMessageHandler에서 파생됩니다.

HttpServer도 HttpMessageHandler에서 파생됩니다. 따라서이 예제에서 HttpServer는 HttpClient 인스턴스로 전달되어 요청 처리를 제공합니다. HttpClient의 생성자에 HttpMessageHandler를 전달하면 HttpClient가 기본 처리기 대신 제공된 처리기를 사용하게됩니다. System.Net.Http.WebRequest에서 WebRequestHandler를 살펴보면 HttpClientHandler에서 파생 된 것을 볼 수 있으며 Windows 데스크톱 OS에 특정한 추가 기능을 추가합니다.

HTTPClient에 요청하면 HttpServer 메시지 처리기로 직접 전달 된 다음 정상적으로 서버에서 처리되는 것처럼 처리됩니다.

+0

그래서 핸들러에 직접 호출하는 방법을 어떻게 알 수 있습니까? HttpServer도 네트워크 연결에 사용되지 않습니까? – jaffa

+0

@jaffa HttpClient는 모든 요청을 제공받은 HttpMessageHandler로 보냅니다. HttpServer는 모든 네트워킹 작업을 처리하는 호스트에 위치합니다. IIS, WCF 자체 호스트 또는 다른 Owin 호스트. –

관련 문제