2012-07-26 18 views
7

NUnitを使用してテストを設定して、ASP.NET WebApiコントローラの統合テストを実行しようとしています。私は、HttpServerを使ったIn-Memoryホスティングについて議論している記事をいくつか見つけました.HttpServerは、すべてをホスティングするWebサーバーを必要としないことを単純化するようです。 NUnitを使用してASP.NET WebApiコントローラとの統合テストを実行する

  • ASP.NET Web API integration testing with in-memory hosting
  • ASP.NET Web API: in-memory hosting
  • 問題

      は私が今まで見つから404-されていない得るだけで応答です。

      コントローラは、ブラウザまたはFiddlerを使用して手動でテストしたときに機能しています。ルート定義は作業現場からコピーされました。テストプロジェクトによってapiプロジェクトが参照され、dllがテストと同じフォルダにコピーされています。

      ありがとうございます。

      はここでテストクラスが

      [TestFixture] 
      public class InMemoryTests 
      { 
          private HttpServer Server; 
          private string UrlBase = "http://some.server/"; 
      
          [TestFixtureSetUp] 
          public void Setup() 
          { 
      
           var config = new HttpConfiguration(); 
           config.Routes.MapHttpRoute(name: "Default", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional }); 
           config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 
      
           Server = new HttpServer(config); 
          } 
      
          [Test] 
          public void GetOrderStatus() 
          { 
           var client = new HttpClient(Server); 
           var request = createRequest("api/Orders/GetOrderStatus?companyCode=001&orderNumber=1234", "application/json", HttpMethod.Get); 
      
           using (HttpResponseMessage response = client.SendAsync(request).Result) 
           { 
            Assert.IsNotNull(response); 
            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); 
            Assert.NotNull(response.Content); 
           } 
          } 
      
          private HttpRequestMessage createRequest(string url, string mthv, HttpMethod method) 
          { 
           var request = new HttpRequestMessage(); 
      
           request.RequestUri = new Uri(UrlBase + url); 
           request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mthv)); 
           request.Method = method; 
      
           return request; 
          } 
      
          private HttpRequestMessage createRequest<T>(string url, string mthv, HttpMethod method, T content, MediaTypeFormatter formatter) where T : class 
          { 
           HttpRequestMessage request = createRequest(url, mthv, method); 
           request.Content = new ObjectContent<T>(content, formatter); 
      
           return request; 
          } 
      
          public void Dispose() 
          { 
           if (Server != null) 
           { 
            Server.Dispose(); 
           } 
          } 
      } 
      
    +0

    :で

    Type myType = typeof(myControllerType); 

    詳細情報 - :このことを確認するために

    はあなたの問題は/一時的な回避策テストの最初の行として追加されます。コントローラーを見ずに言うのは難しい。/api/Orders/GetOrderStatus?companyCode = 001&orderNumber = 1234このアクションの定義を投稿できますか? –

    +0

    コントローラーは本当に特別なものはありません。手動でテストする場合はすべて動作します。また、どのコントローラをテストしても同じ結果が得られます。 – Rick

    答えて

    8

    だ私もこの問題を見ていた、私は私のコントローラと同じアセンブリ内に私のテストクラスを移動したときに離れて行くように見えました。私が知っているテストでは一般的に実用的ではありませ

    少し掘り下げた後、必要なアセンブリをロードできなかったため、呼び出し元コードがコントローラと同じアセンブリを共有していないときに、自己ホストでのみ発生するバグがあります。これはOKになりますhttp://forums.asp.net/t/1772734.aspx/1

    +0

    あなたの答えを正しいものとしてマークしてください。私はasp.netフォーラムに自分の質問を投稿し、同じ答えを得ました。コントローラが必要とするすべての依存関係が利用可能であることを保証しなければならなかったので、もう少し作業をしなければなりませんでした。(http://forums.asp.net/t/1829098.aspx/1?Using+HttpServer+to + +積算+テスト+ + NUnitを実行 – Rick

    +0

    これはなぜですか?私は同じことをしましたが、同じアセンブリにテストメソッドを置くと、テストプロジェクトのように別の場所に置くと動作しませんでした。 – appsecguy

    +0

    この問題は過去2日間私を悩ませています。ありがとうございました! – Jethro

    関連する問題