2016-05-10 19 views
0

私は現在、定義された時間にHttpContext.Current.User.Identity.Nameを使用しているプロジェクトの単体テストを書いています。残念ながら、私はテストを実行するときHttpContextがnullであるため、テスト作業を行うことはできません。模擬HttpContext.Current.User.Identity.Name

私は既にThread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("rmllcc"), new string[0]);のようなインターネット上で見つかった解決策を試しましたが、うまく動作しません。

私はForms Authenticate system,xUnitMoqを使用しています。私はコントローラをテストするのではなく、ユーザが特定の方法を使うたびにログを取っているところのRepositoryです。どのように私はこれを達成することができますか?

+0

ですから、リポジトリへのパラメータとしてのHttpContextを渡しますか? –

+0

@DanielStackenlandいいえ、ただ使っています。私のコントローラからリポジトリを呼び出し、ログされたユーザの値と時間だけを記録してください。 – Sakuto

+0

'HttpContext'をモックしないでください。代わりに、それがあなたが望むものの抽象化を作成し、それをあなたのリポジトリへのサービスとして渡します。あなたに何を求めているのかについての多くの疑問があります。そして、彼らの大部分がこれを示唆していることがわかります。 – Nkosi

答えて

3

私はあなたがリポジトリからHttpContextを使用しないこと、独自のコンテキストクラスを作成すること、またはユーザープロパティをラッピングするインターフェイスの使用をお勧めします。このような

何か:その後、ちょうどあなたのテストでMyContext

public class MyContext 
    { 
     public MyContext(string username) 
     { 
      Username = username; 
     } 

     public string Username { get; private set; } 

     public static MyContext CreateFromHttpContext(HttpContext httpContext){ 
      return new MyContext(HttpContext.Current.User.Identity.Name); 
     } 
    } 


public class MyRep 
    { 
     private readonly VtContext _context; 

     public MyRep(MyContext context) 
     { 
      _context = context; 
     } 

     ... other repository code... 

    } 

を作成します。

var rep = new MyRep(new MyContext("unittest")); 
2

あなたのテストがあなたに伝えていることを聞く:このテストがコードの構造について考えるのが難しいという事実を利用してください。リポジトリ層にWebアプリケーションへの依存関係を導入しました。それは良いことではありません。また、リポジトリにはデータアクセスとロギングという2つのことがあります。

現在のユーザーを必要なユーザーになる抽象的にラップすることはできますが、簡単にスタブすることができます。あるいは、あなたのためのロギングを行うデコレータにリポジトリをラップすることもできます。

申し訳ありませんが、これは質問への直接的な回答ではありませんが、テストを書くのが難しい場合は、通常、対処する必要がある深い根本的な理由があります。