9

WebAPI コントローラーをテストするための基礎として使用したい統合テストがあります。

最初は、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;

}
4

1 に答える 1

9

HttpClient には、プラグ可能なパイプライン モデルがあります。通常、HttpClient を新しく作成すると、デフォルトのリクエスト プロセッサとして HttpClientHandler インスタンスが取得されます。その HttpClientHandler は、実際に HttpWebRequest を実行するものです。HttpClientHandler は HttpMessageHandler から派生します。

偶然にも、HttpServer も HttpMessageHandler から派生しています。したがって、この例では、HttpServer が HttpClient インスタンスに渡されて、リクエスト処理が提供されます。HttpMessageHandler を HttpClient のコンストラクターに渡すことで、既定のハンドラーではなく、提供されたハンドラーを使用するように HttpClient に指示します。System.Net.Http.WebRequest の WebRequestHandler を見ると、これが HttpClientHandler から派生したものであり、Windows デスクトップ OS に固有の機能がいくつか追加されていることがわかります。

つまり、HTTPClient にリクエストを送信すると、リクエストは HttpServer メッセージ ハンドラーに直接配信され、サーバー上で通常どおりに処理されます。

于 2012-05-04T12:30:21.470 に答える