2012-04-28 46 views
0

背景:我們使用MVC4並使用WIF進行聲明/授權。我們使用Moq/MvcContrib進行樣機對象。我看了here並創建了MockIdentity和MockPrincipal對象 - 我需要它們嗎?.Net MVC中的單元測試聲明應用程序

目標:我有一個控制器類,它具有僅允許具有「經理」聲明的用戶訪問操作的類級屬性。我想創建模擬用戶並測試是否有任何沒有「經理」聲明的人可以訪問該操作。

我得到了模擬概念,但我只處理了數據對象嘲諷和困難的時間,弄清楚我需要做什麼插件/類/方法/設置。

在此先感謝。

+0

爲什麼你會測試這個?您將要驗證的是MVC自己的基礎架構。爲什麼這對你的應用有價值?如果您的邏輯(而不是MVC)受到Manager聲明的影響,情況會有所不同。然後,一個單元測試將是有意義的,並嘲笑校長等將是必要的(如果你打電話給IPrincipal.IsInRole()例如)。 – 2012-04-30 20:26:32

回答

2

我想創建模擬用戶並測試是否有人沒有「經理」聲明可以訪問操作。

不,你不知道。您只想將用戶傳遞給您編寫的屬性並進行測試,即可正確設置filterContext.Result。而已。您不需要測試System.Web.Mvc的工作方式。正在測試的單個單元!

推測你的屬性是AuthorizeAttribute,對嗎?所以你需要測試OnAuthorization(AuthorizationContext)

免責聲明:我沒有用過起訂量在一段時間,但你的代碼大概看起來一般是這樣的:

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 2012-04-29 15:45:18

+0

MvcContrib爲獲得完全初始化的控制器提供了一些幫助。在這種情況下,由於您只是測試屬性,所以您不需要。 至於那個人在做什麼 - 使用像Roles.AddUserToRole這樣的靜態方法使得單元測試非常困難。另一個不避免它們的原因。 – bhamlin 2012-04-29 19:29:35