2011-10-04 25 views
1

在這裏,在控制器asp.net的MVC單元測試模擬問題

var roles = Roles.GetAllRoles(); 

從單元測試呼叫 失敗,並在

LogOnTest()(Error message is "The Role Manager feature has not been enabled.") 

你能告訴我,我的測試功能是否正確還是需要更多的邏輯/功能測試?

[TestMethod] 
public void LogOnTest() 
{ 
    var target = new AccountController(); 
    var membershipMock = MockRepository.GenerateMock<AccountMembershipService>(); 
    var formsMock = MockRepository.GenerateMock<IFormsAuthenticationService>(); 

    target.FormsService = formsMock; 
    target.MembershipService = membershipMock; 

    var model = new LogonModel() { USERNAME= "aa", Password = "aa"}; 
    string returnUrl = null; 
    bool isLoginSuccess = true; 
    var actual = target.LogOnFromUser(model); 
    if (actual == null) 
     Assert.Fail("should have redirected"); 
} 

控制器:

public ActionResult LogOn(LogonModel model) 
     { 
if(MembershipService.ValidateUser(model.UsernName, model.Password)) 
       { 
        FormsService.SignIn(model.UsernName, true); 
             var roles = Roles.GetAllRoles(); //Roles got failed here 
return RedirectToAction("Index", "Event"); 
} 
else 
{ 
ModelState.AddModelError("", "The user name or password provided is incorrect."); 

      return View("LogOn", model); 
} 
+0

如果你找到一個答案是有用的,你應該爲它投票(點擊向上箭頭答案的左上角),如果它回答你的問題,你也應該通過點擊刻度接受它作爲一個答案也在答案的左上角 –

回答

1

您需要創建圍繞靜態Roles類的包裝,這樣你可以注入一個模擬實現,你是在控制。基本上這可能類似於您的MembershipServiceFormsService(可能稱爲IRoleService),並且需要使用方法GetAllRoles()

您可以在您的控制器的空arg構造函數中創建默認實現(這隻會委託給當前靜態類)(這是我想象的與您的會員和表單服務發生的事情,並提供了一個屬性以允許您以其他方式替代它。

另一種選擇是擴展您的成員資格服務以允許您調用此方法,而不是專門爲角色創建另一個服務,這違背了單一責任原則,所以不一定是一個好主意,但它的確意味着你不必注入另一個依賴關係,並且可以認爲獲得成員的角色在成員服務的職責範圍之內。

說實話,我認爲你應該更好地改變你的控制,讓它有一個明確要求實現成員服務,構造服務和角色服務以及在測試中提供模擬的構造函數。這使得它明確了控制器的依賴關係。您將需要繼續創建控制器的新方法,因爲如果默認構造函數具有默認構造函數,則只能創建它們。 YUOU在這裏有幾個選擇。請保留您的選項並使用默認值,或者實施您自己的ControllerFactory。一些細節here。我個人更喜歡ControllerFactory方法。

1

從理論上講,我更喜歡@山姆的方法,但我仍在努力讓它適合我的依賴注入。我真的希望能夠模擬我自己的數據並完全控制我的測試。

爲停止的差距,但是,我發現這裏的建議:http://blog.gfader.com/2009/11/aspnet-how-to-show-all-roles-of-current.html

從這個我剛纔添加下面的App.config中的代碼,我可以加上測試移動。

<system.web> 
     <roleManager enabled="true" 
      defaultProvider="AspNetWindowsTokenRoleProvider" /> 
    </system.web>