2009-12-09 19 views
26

私はstackoverflowを検索して、数時間で4〜4時間のグーグルを検索しましたが、私の "些細な"問題の解決策はまだ見つかりませんでした。[Authorize]属性が適用されたコントローラメソッドをユニットテストするにはどうすればよいですか?

フィルタリングされた[Authorize] ActionResultの単体テストを書く場合、そのユーザが認証されていることを偽ってどのように問題を解決しますか?

私は[Authorize]で濾過されActionResult方法がたくさんあるし、私は彼らが[Authorize]かでフィルタリングしている場合に関係なく、私のActionResultすべてのメソッドをテストしたいです。

私が何を意味するかの簡単な例:

[TestMethod] 
public void Create_Get_ReturnsView() 
{ 
// Arrange 
var controller = new UserController(); 
// Act 
var result = controller.Create(); 
// Assert 
Assert.IsNotNull(result as ViewResult); 
} 

[Authorize] 
public ActionResult Create() 
{ 
return View("Create"); 
} 

テストもあるため、[オーソライズ]フィルタでのActionResultメソッドをヒットしていない今のところ、例外スローがある:System.NullReferenceException: Object reference not set to an instance of an object.

+1

あなたが私たちに示していないことがあります。あなたが表示するテストは*アクションフィルタを実行しません。たぶんコードはありますが、それはあなたの質問にはありません。まず、エラーの呼び出しスタック全体について、まずはどうですか? –

答えて

25

あなたはあなたのコントローラのコンテキストをモックする必要があります。あなたは、あなたの行為&アサートを行うことができるはず

var controller = new UserController(); 
var mock = new Mock<ControllerContext>(); 
mock.SetupGet(x => x.HttpContext.User.Identity.Name).Returns("SOMEUSER"); 
mock.SetupGet(x => x.HttpContext.Request.IsAuthenticated).Returns(true); 
controller.ControllerContext = mock.Object; 

:あなたの手配Moq

を使用してみてくださいすることは、次にようになります。

まだお持ちでない場合は、MVCサイトの例としてNerdDinnerをご覧になることを強くお勧めします。

+0

素晴らしい、これは完璧に機能しました...ありがとうalot – Webking

+0

私はあなたが本当にこれをテストする必要はないと主張するかもしれません。この属性は、すでにASP.NET MVCを作成したチームによって十分にテストされています。あなたはソースをダウンロードして自分で見ることができます。 –

+8

'[Authorized]'属性をテストするのではなく、 'ActionResult'メソッドをテストすることです。 – AndyMcKenna