2016-12-06 5 views
3

それぞれのメソッドでHttpContext.Currentを呼び出すASP.Net MVCコントローラで統合テストを行う必要があります。私はいろいろなアプローチを試して、すでに多くの研究を行ってきましたが、私は何かが欠けているように感じます。httpcontext.currentを呼び出すmvcコントローラの統合テストを行う方法

  • Asp.Netコア::私はのルートを行っている私は、ステファン・スタイガー(How to get HttpContext.Current in ASP.NET Core?)のasp.netコアテストホストの礼儀を使用して、スタックオーバーフローのハックを発見しました。これは素晴らしい解決策です。しかし、実装と追加の読み込みを試みると、これはaspnetcoreコントローラでのみ機能し、後方互換性はないようです。私はシムを知っているが、私はどのようにそれを使用するかについての指示を見つけることができません。
  • バッチファイルを使用してiis expressをスピンアップし、通話を発信します。私がこのアプローチで得た問題は、私がテストでデバッグできる必要があるということです。私はVisual Studioのデバッガに接続しようとしましたが、これは何らかの理由で動作しませんでした。私はブレークポイントでメッセージを取得し続けました "ブレークポイントは現在ヒットしません。このドキュメントのシンボルはロードされていません"。
  • また、テストコントローラでプログラムをプログラムで起動する方法を調査しましたが、Visual Studio Webプロジェクトをプログラムで起動する方法が見つかりませんでした。 (プロセスとmsbuild経由で起動するように見てください)
  • 現在、私はowin自己ホストを使ってテストしていますが、HttpContext.Currentはコントローラ内ではnullです(明らかに)。これを回避する方法がある場合は、最も好ましい方法です。

これらのテストをどのように行うかに関するアドバイスは非常に高く評価されます。

おかげで、

編集は、私は次のメソッドを使用して添付しています:

private static bool AttachToIIS(int tries = 10, int threadsleep = 500) 
    { 
     System.Threading.Thread.Sleep(1000); 
     bool isAttached = false; 
     int count = 0; 
     while (isAttached == false && count < tries) 
     { 
      _DTE dte = (_DTE)Marshal.GetActiveObject("VisualStudio.DTE.14.0"); 
      Processes processes = dte.ActiveWindow.DTE.Debugger.LocalProcesses; 
      foreach (EnvDTE.Process process in processes) 
      { 
       System.Diagnostics.Debug.WriteLine("process: " + process.Name); 
       try 
       { 
        if (process.Name.Contains("iis")) 
        { 
         process.Attach(); 
         isAttached = true; 
        } 
       } 
       catch (Exception e) 
       { 
        System.Diagnostics.Debug.WriteLine(e.Message); 
       } 
      } 
      System.Threading.Thread.Sleep(threadsleep); 
      count++; 
     } 
     return isAttached; 
    } 

1風変わりiは(私はCOMの専門家でありません)デバッガに接続するとき、それはデバッガをアタッチということです最初に開いたビジュアルスタジオインスタンスの

+0

アップデート:私はスピンアップのルートを明示し、デバッガをアタッチIIS行ってきました。そのトリックは、あるスレッドでiisを実行し、別のスレッドで要求を実行することでした。コントローラーがヒットしデバッグ可能で、httpcontext.currentがnullではありません。ただし、これは、テストが実行される前にiisが実行されている場合にのみ発生します。したがって、iisをまだ実行していない状態で実行すると、コントローラのブレークポイントはヒットしませんが、以前に実行していたiisでテストを実行するとヒットします。私はこれがプロセスと関係していると確信しています。 – user1883961

+0

更新:iis expressをバックグラウンドでスピンアップして実行しています。ユニットテストでサーバーに呼び出します。奇妙なのは、私がCOMエキスパートではないデバッガに接続すると、最初に開いたビジュアルスタジオインスタンスのデバッガが接続されるということです。 – user1883961

答えて

0

あなたがHttpContext.Currentを使うなぜによっては、あなたの代わりにControllerクラスのHttpContextプロパティを使用するようにコードを修正することができます。

次に、HTTPコンテキストを含むテスト用にカスタムControllerContextを作成することができます。 MVCは、HttpContextBaseを使用するため、テストで完全にカスタムのHTTPコンテキストを継承し、模擬することもできるため、MVCは古いASP.NETよりもインテリジェントです。

関連リンク:

+0

私はコントローラのエンドポイントを変更するだけで、iocコンテナを使って、テスト時にIHttpContextManagerのテストバージョン(HttpContextを返す)を返すインターフェイスの 'shim'実装を注入し、実際のCurrent HttpContextを実行しました。再度、感謝します!!! – user1883961

関連する問題