2012-04-28 8 views
0

背景:クレーム/認可にはMVC4を使用し、WIFを使用しています。モックアップオブジェクトにはMoq/MvcContribを使用しています。私はhereを見て、MockIdentityとMockPrincipalオブジェクトを作成しました - 私はそれらを必要としますか?.Net MVCアプリのユニットテストクレーム

目標:「管理者」の主張を持つユーザーのみがアクションにアクセスできるようにするクラスレベルの属性を持つコントローラクラスがあります。私は偽のユーザーを作成し、 'マネージャ'クレームを持たない誰かがアクションにアクセスできるかどうかを確認するテストをしたいと思います。

私はモックコンセプトを取得しましたが、私はデータオブジェクトを嘲笑して、私が必要とすることを実行するために必要なプラグイン/クラス/メソッド/設定を調べるのに苦労しました。

ありがとうございます。

+0

は、なぜあなたはこれをテストでしょうか?あなたが確認しているのは、MVC独自のインフラストラクチャだけです。なぜそれはあなたのアプリにとって貴重なのですか?あなたのロジック(MVCではなく)がManagerの主張の影響を受けていれば、それは違うでしょう。単体テストは意味をなさないでしょうし、(IPrincipal.IsInRole()を呼び出す場合など)プリンシパルを嘲笑するなどが必要になります。 –

答えて

2

私は模擬ユーザーを作成し、「マネージャ」クレームを持たない誰かがアクションにアクセスできるかどうかをテストしたいと考えています。

いいえ、ありません。 filterContext.Resultを正しく設定した書き込み属性のユーザーにユーザーを渡したいだけです。それでおしまい。 System.Web.Mvcが動作することをテストする必要はありません。テスト中の単一ユニット!

あなたの属性はおそらくAuthorizeAttributeですか?したがって、OnAuthorization(AuthorizationContext)をテストする必要があります。

免責事項:私はしばらくMOQを使用していないが、あなたのコードは、おそらく一般的に次のようになります。

var user = new Mock<IPrincipal>(); 
user.Setup(/* whatever you need to look at */); 

var authContext = new Mock<AuthorizationContext>(); 
authContext.Setup(ac => ac.HttpContext.User).Returns(user); 

var myAttribute = new RequireManagerAttribute(); 
myAttribute.OnAuthorization(authContext); 

authContext.VerifySet(ac => ac.Result = /* whatever you expect */); 
+0

ありがとう、私はそれを試み、報告する...あなたはSOサンプルを見て、OPが彼がやっていることをやっている理由を教えてくれますか?また、いつMvcContribが必要ですか? – Pete

+0

MvcContribは完全に初期化されたコントローラを構築する助けをいくつか提供します。この場合、属性をテストしているだけなので、その属性は必要ありません。 Roles.AddUserToRoleのような静的メソッドを使用すると、ユニットのテストが本当に困難になります。それらを避けない別の理由。 – bhamlin