2011-07-13 19 views
0
public SupportedBrowser GetBrowser() 
    { 
     string agent = HttpContext.Current.Request.Headers["User-Agent"]; 

     if (agent.Contains("iPad")) 
     { 
      return new iPad(); 
     } 
     else 
      return new InternetExplorer7(); 
    } 

私は、上記の方法の単位テストをMicrosoft単体テストツール(MS-Test?)を使用してセットアップしました。単体テストはWebサイトではないので、HttpContextはありません。HttpContextを使用した単体テスト方法

A.オプションのパラメータ:GetBrowser(bool debug = false)を追加します。これにより、現在のコードをリファクタなしで実行することができます。次に、デバッグが真であるときに、モックコンテキストまたはハードコードされたユーザエージェントを作成するためのメソッドを変更します。

B.追加依存性注入。他の場所からコンテキストを取得します。しかし、私はこれを自動化するためには、私はIoCに落とす必要があると思う。それはたくさんの仕事です。

あなたはこれらのアイデアを改善したり改善したりすることはできますか?

注:このメソッドは、クラスライブラリに格納されています。私はそれをそのままにしたい。

答えて

2

あなたのエージェントの文字列は、モッキングのための自然な場所です。このメソッド内のリクエストコンテキストからエージェント文字列を取得する代わりに、それを渡すか、メソッド/クラスに注入します。そうすることで、テストやランタイム中にコントロールすることができます。

+0

DI(依存性注入)を支持するために+1 – Nauman

+0

私はDIが好きですが、私の質問に載せているように、これはかなりうまくいくと思います。 HttpContext.Request.UserAgentは読み取り専用なので、テスト用に設定することはできません。私はここでmallows98の答えに類似したものを使ってすべてを出す必要があるかもしれません。http://stackoverflow.com/questions/1452418/how-do-i-mock-the-httpcontext-in-asp-net-mvc-using-moqその経路を避けようとしています。 –

+1

コンテキストを挿入しないで、エージェントストリングを挿入してください。それはあなたにそれを完全にコントロールさせるでしょう。 –

関連する問題