2011-10-01 29 views
0

我想創建以下控制器單元測試,但它得到了在Membership類故障:單元測試控制器 - 會員錯誤

 

    public class AccountController:BaseController 
    { 
     public IFormsAuthenticationService FormsService { get; set; } 
     public IMembershipService MembershipService { get; set; } 

     protected override void Initialize(RequestContext requestContext) 
     { 
      if(FormsService == null) { FormsService = new FormsAuthenticationService(); } 
      if(MembershipService == null) { MembershipService = new AccountMembershipService(); } 

      base.Initialize(requestContext); 
     } 
     public ActionResult LogOn() 
     { 
      return View("LogOn"); 
     } 

     [HttpPost] 
     public ActionResult LogOnFromUser(LappLogonModel model, string returnUrl) 
     { 
      if(ModelState.IsValid) 
      { 
       string UserName = Membership.GetUserNameByEmail(model.Email); 
       if(MembershipService.ValidateUser(model.Email, model.Password)) 
       { 
        FormsService.SignIn(UserName, true); 

        var service = new AuthenticateServicePack(); 
        service.Authenticate(model.Email, model.Password); 
        return RedirectToAction("Home"); 
       } 
      } 
      ModelState.AddModelError("", "The user name or password provided is incorrect."); 
      return View("LogOn", model); 
     } 
    } 

單元測試代碼:

 

    [TestClass] 
    public class AccountControllerTest 
    { 
     [TestMethod] 
     public void LogOnPostTest() 
     { 
      var mockRequest = MockRepository.GenerateMock(); 
      var target = new AccountController_Accessor(); 
      target.Initialize(mockRequest); 
      var model = new LogonModel() { UserName = "test", Password = "1234" }; 
      string returnUrl = string.Empty; 
      ActionResult expected = null; 
      ActionResult actual = target.LogOn(model, returnUrl); 
      if (actual == null) 
       Assert.Fail("should have redirected"); 

     } 
    } 

當我用Google搜索,我得到了以下代碼,但我不知道如何將成員資格傳遞給帳戶控制器

 

    var httpContext = MockRepository.GenerateMock(); 
       var httpRequest = MockRepository.GenerateMock(); 
       httpContext.Stub(x => x.Request).Return(httpRequest); 
       httpRequest.Stub(x => x.HttpMethod).Return("POST"); 

       //create a mock MembershipProvider & set expectation 
       var membershipProvider = MockRepository.GenerateMock(); 
       membershipProvider.Expect(x => x.ValidateUser(username, password)).Return(false); 

       //create a stub IFormsAuthentication 
       var formsAuth = MockRepository.GenerateStub(); 

      /*But what to do here???{............... 
       ........................................ 
       ........................................}*/ 

       controller.LogOnFromUser(model, returnUrl); 

Ple ase幫助我獲得這個代碼的工作。

回答

0

看起來好像您正在使用IMembershipServive和IFormsAuthenticationService的具體實例,因爲您正在使用Accessor來初始化它們。當你使用具體的類時,你並不是真的獨立地測試這個類,這就解釋了你所看到的問題。

你真正想要做的是測試控制器的邏輯,而不是其他服務的功能。

幸運的是,這是一個簡單的修復方法,因爲MembershipService和FormsService是控制器的公共成員,可以用模擬實現來替換。

// moq syntax: 
var membershipMock = new Mock<IMembershipService>(); 
var formsMock = new Mock<IFormsAuthenticationService>(); 

target.FormsService = formsMock.Object; 
target.MembershipService = membershipService.Object; 

現在你可以爲你的控制器測試幾種情況:

  • 什麼時候MembershipService沒有找到用戶發生了什麼?
  • 密碼無效?
  • 用戶名和密碼是否有效?

請注意,如果AuthenticationServicePack具有其他服務或依賴關係,它也會導致問題。您可能需要考慮將其轉換爲控制器的屬性,或者如果需要對每個身份驗證使用單個實例,請考慮使用工廠或其他服務來封裝此邏輯。

+0

太好了,謝謝。 – developer