2011-10-01 5 views
0

: 내가 봤 때단위 테스트 컨트롤러 - 나는 다음과 같은 컨트롤러에 대한 단위 테스트를 만들려하지만 회원 클래스에서 실패있어 회원 오류

 

    [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"); 

     } 
    } 

:

 

    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); 
     } 
    } 

단위 테스트 코드 다음 코드가 있지만 accountcontroller에 멤버십을 전달하는 방법을 모르겠다.

 

    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

마치 IMombershipServive 및 IFormsAuthenticationService의 구체적인 인스턴스는 액세서를 사용하여 초기화하는 것처럼 보이기 때문에 나타납니다. 구체적인 클래스를 사용할 때는이 클래스를 실제로 테스트하지 않고보고있는 문제를 설명합니다.

정말로하고 싶은 것은 다른 서비스의 기능이 아니라 컨트롤러의 로직을 테스트하는 것입니다.

다행히도 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

관련 문제