2009-08-21 6 views
10

私は、私は私のNUnitの私のセットアップモックアップ用にIPrincipalを設定するには?

Principal = new Mock<IPrincipal>(); 

でこの

public Mock<IPrincipal> Principal { get; set; } 

をしたので、これは私が私のNUnitのユニットテストに必要なものすべてが、どのようにについての私の実際であるべきIPrincipalをモックアップしたいですコントローラファイル?

どうすれば設定できますか?例えば

私はmembership.Provider

を持っているので、私がやったことは、私は私のコントローラIちょうど使用プロバイダでそれでは

Provider = Membership.Provider; 

をしました。(私は必要なものは何でも)私のコントローラのコンストラクタにありました。

同じようにプリンシパルをセットアップする方法がわかりません。

答えて

20

ASP.NET MVCについてお聞きしますか?たぶんそうだ。

コントローラのインスタンスを作成し、そのRequestContextを設定する必要があります。あなたはRequestContextのののHttpContextを嘲笑し、これのHttpContextの内側には、そのユーザーのプロパティを模擬し、あなたの嘲笑IPrincipalにそれを設定します

var principal = new Moq.Mock<IPrincipal>(); 
// ... mock IPrincipal as you wish 

var httpContext = new Moq.Mock<HttpContextBase>(); 
httpContext.Setup(x => x.User).Returns(principal.Object); 
// ... mock other httpContext's properties, methods, as needed 

var reqContext = new RequestContext(httpContext.Object, new RouteData()); 

// now create the controller: 
var controller = new MyController(); 
controller.ControllerContext = 
    new ControllerContext(reqContext, controller); 

・ホープ、このことができます。

EDIT:あなたがここに見ることができるよう

FYI、コントローラクラス上のUserプロパティには、HttpContextオブジェクトから来ている(これはリフレクターから取得したユーザープロパティのgetterメソッド、です - あなたはASPをダウンロードすることができます.NET MVCだけでなく、ソースコード):

public IPrincipal User 
{ 
    get 
    { 
     if (this.HttpContext != null) 
     { 
      return this.HttpContext.User; 
     } 
     return null; 
    } 
} 

あなたは今のHttpContextプロパティをチェックすると、あなたが表示されます。

public HttpContextBase HttpContext 
{ 
    get 
    { 
     if (base.ControllerContext != null) 
     { 
      return base.ControllerContext.HttpContext; 
     } 
     return null; 
    } 
} 

だから、すべてが今まで読んで「でしたのみ"。そして私たちは嘲笑された "ユーザー"を "注入"する方法が必要です。そこで、実際にコントローラー上にControllerContextオブジェクトをプロパティで挿入できることを確認します。私たちは、それを適切にモックアップする方法を知って、それはその「のHttpContext」オブジェクトを取得する方法を確認します。だから、

public virtual HttpContextBase HttpContext 
{ 
    get 
    { 
     if (this._httpContext == null) 
     { 
      this._httpContext = (this._requestContext != null) ? this._requestContext.HttpContext : new EmptyHttpContext(); 
     } 
     return this._httpContext; 
    } 
    set 
    { 
     this._httpContext = value; 
    } 
} 

、ここでは、ControllerContextオブジェクトは、それがのHttpContext RequestContextのオブジェクトからだ取得していることがわかります。

  1. 必要なデータとモックIPrincipal、
  2. モックのHttpContextを、そして
  3. 、IPrincipalでそれを養うモックRequestContextのを、とでそれを養う:だから、私は上記のやったことを説明するかもしれませんHttpContext、
  4. コントローラのインスタンスを作成し、ControllerContextプロパティを模擬されたRequestContextオブジェクトに設定します。

この魔法の後、コントローラーはWebサーバー経由で実際に接続せずにコントローラーを呼び出すことはできません。

したがって、コントローラの中でいつものように "User"プロパティを使用することができます。変更は必要ありません。

+0

実際のコントローラクラスはどのように見えますか? – chobo2

+1

どういう意味ですか?これは、アクションを持つ「通常の」コントローラでなければなりません。正確に何をテストしたいですか? –

+0

まあ、このようなコントローラにコードを残すことはできません 私のモックアップではこれをセットアップしないで、私のコントローラにいくつかの方法を渡します(プロパティインジェクションまたはコンストラクタインジェクションによる)それは嘲笑されません。私はあなたのパスを何かreContextのものがコントローラコンテキストthngとコントローラに渡しているのを見ていますが、それが何であるかもわかりません。 – chobo2

関連する問題