2

내 계정 컨트롤러를 적절하게 테스트하는 방법을 알아 내려고 시도했습니다. 성공적인 로그온 시나리오를 테스트하는 데 문제가 있습니다.양식 인증을위한 계정 컨트롤러 테스트 작성 방법

문제 1) 나는 다른 테스트 실종. (I가 전달되지 않음) 모델 검증 별도로 속성

문제 2) Put_ReturnsOverviewRedirectToRouteResultIfLogonSuccessAndNoReturnUrlGiven()와 Put_ReturnsRedirectResultIfLogonSuccessAndReturnUrlGiven() 테스트를 테스트입니다. _membership.validateuser()를 호출하는 줄로 좁혔습니다. 서비스의 내 모의 설치 중에 나는 validateuser가 호출 될 때마다 true로 되돌아 가고 싶다고 말하고 있지만, 메서드 호출은 false를 반환합니다. 여기

내가 지금까지받은

AccountController.cs

[HandleError] 
public class AccountController : Controller 
{ 
    private IMembershipService _membershipService; 

    public AccountController() 
     : this(null) 
    { 
    } 

    public AccountController(IMembershipService membershipService) 
    { 
     _membershipService = membershipService ?? new AccountMembershipService(); 
    } 

    [HttpGet] 
    public ActionResult LogOn() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (_membershipService.ValidateUser(model.UserName,model.Password)) 
      { 
       if (!String.IsNullOrEmpty(returnUrl)) 
       { 
        return Redirect(returnUrl); 
       } 
       return RedirectToAction("Index", "Overview"); 
      } 
      ModelState.AddModelError("*", "The user name or password provided is incorrect."); 
     } 

     return View(model); 
    } 

} 

AccountServices.cs

public interface IMembershipService 
{ 
    bool ValidateUser(string userName, string password); 
} 

public class AccountMembershipService : IMembershipService 
{ 
    public bool ValidateUser(string userName, string password) 
    { 
     throw new System.NotImplementedException(); 
    } 
} 

AccountControllerFacts.cs

public class AccountControllerFacts 
{ 
    public static AccountController GetAccountControllerForLogonSuccess() 
    { 
     var membershipServiceStub = MockRepository.GenerateStub<IMembershipService>(); 
     var controller = new AccountController(membershipServiceStub); 
     membershipServiceStub 
       .Stub(x => x.ValidateUser("someuser", "somepass")) 
       .Return(true); 
     return controller; 
    } 

    public static AccountController GetAccountControllerForLogonFailure() 
    { 
     var membershipServiceStub = MockRepository.GenerateStub<IMembershipService>(); 
     var controller = new AccountController(membershipServiceStub); 
     membershipServiceStub 
       .Stub(x => x.ValidateUser("someuser", "somepass")) 
       .Return(false); 
     return controller; 
    } 

    public class LogOn 
    { 
     [Fact] 
     public void Get_ReturnsViewResultWithDefaultViewName() 
     { 
      // Arrange 
      var controller = GetAccountControllerForLogonSuccess(); 

      // Act 
      var result = controller.LogOn(); 

      // Assert 
      Assert.IsType<ViewResult>(result); 
      Assert.Empty(((ViewResult)result).ViewName); 
     } 

     [Fact] 
     public void Put_ReturnsOverviewRedirectToRouteResultIfLogonSuccessAndNoReturnUrlGiven() 
     { 
      // Arrange 
      var controller = GetAccountControllerForLogonSuccess(); 
      var user = new LogOnModel(); 

      // Act 
      var result = controller.LogOn(user, null); 
      var redirectresult = (RedirectToRouteResult) result; 

      // Assert 
      Assert.IsType<RedirectToRouteResult>(result); 
      Assert.Equal("Overview", redirectresult.RouteValues["controller"]); 
      Assert.Equal("Index", redirectresult.RouteValues["action"]); 
     } 

     [Fact] 
     public void Put_ReturnsRedirectResultIfLogonSuccessAndReturnUrlGiven() 
     { 
      // Arrange 
      var controller = GetAccountControllerForLogonSuccess(); 
      var user = new LogOnModel(); 

      // Act 
      var result = controller.LogOn(user, "someurl"); 
      var redirectResult = (RedirectResult) result; 

      // Assert 
      Assert.IsType<RedirectResult>(result); 
      Assert.Equal("someurl", redirectResult.Url); 
     } 

     [Fact] 
     public void Put_ReturnsViewIfInvalidModelState() 
     { 
      // Arrange 
      var controller = GetAccountControllerForLogonFailure(); 
      var user = new LogOnModel(); 
      controller.ModelState.AddModelError("*","Invalid model state."); 

      // Act 
      var result = controller.LogOn(user, "someurl"); 
      var viewResult = (ViewResult) result; 

      // Assert 
      Assert.IsType<ViewResult>(result); 
      Assert.Empty(viewResult.ViewName); 
      Assert.Same(user,viewResult.ViewData.Model); 
     } 

     [Fact] 
     public void Put_ReturnsViewIfLogonFailed() 
     { 
      // Arrange 

      var controller = GetAccountControllerForLogonFailure(); 
      var user = new LogOnModel(); 

      // Act 
      var result = controller.LogOn(user, "someurl"); 
      var viewResult = (ViewResult) result; 

      // Assert 
      Assert.IsType<ViewResult>(result); 
      Assert.Empty(viewResult.ViewName); 
      Assert.Same(user,viewResult.ViewData.Model); 
      Assert.Equal(false,viewResult.ViewData.ModelState.IsValid); 
     } 
    } 
} 

답변

2

을 시간을 알아 낸 것입니다 내 검사를 고쳐야 겠어.

 [Fact] 
     public void Put_ReturnsRedirectToRouteResultForOverviewIfLogonSuccessAndNoReturnUrlGiven() 
     { 
      // Arrange 
      var mocks = new MockRepository(); 
      var mockMembershipService = mocks.StrictMock<IMembershipService>(); 
      using (mocks.Record()) 
      { 
       Expect.Call(mockMembershipService.ValidateUser("", "")).IgnoreArguments().Return(true).Repeat.Any(); 
      } 
      var controller = new AccountController(mockMembershipService); 
      var user = new LogOnModel(); 

      // Act 
      ActionResult result; 
      using (mocks.Playback()){ 
       result = controller.LogOn(user, null); 
      } 

     // Assert 
      Assert.IsType<RedirectToRouteResult>(result); 
      var redirectresult = (RedirectToRouteResult)result; 
      Assert.Equal("Overview", redirectresult.RouteValues["controller"]); 
      Assert.Equal("Index", redirectresult.RouteValues["action"]); 
     }