2012-05-04 13 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は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 Self Host、または他のOwinホスト。 –

関連する問題