2012-04-29 5 views
1

Azure가있는 MVC4 프로젝트가 있습니다. 나는 간단한 테스트를 작성하여 사용자 로그인을 확인하려고합니다. 내 로그인 조치가컨트롤러 매개 변수가있는 단위 테스트

[HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (Membership.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
       if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") 
        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) 
       { 
        return Redirect(returnUrl); 
       } 
       else 
       { 
        return RedirectToAction("Index", "Home"); 
       } 
      } 
      else 
      { 
       ModelState.AddModelError("", "The user name or password provided is incorrect."); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

내 시험 방법 나는이 문제가

[TestMethod] 
public void UserValidLoginTest() 
{ 
    // Arrange 
    AccountController controller = new AccountController(); 

    // Act 
    LogOnModel model = new LogOnModel() 
    { 
     UserName = "[email protected]", 
     Password = "pass1234" 
    }; 

    var result = controller.LogOn(model, null) as RedirectToRouteResult; 

    // Assert 
    Assert.IsNotNull(result); 
    Assert.AreEqual(result.RouteValues["action"], "Index"); 
} 

로 정의됩니다, 처음도

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

반환 NullReferenceException이와

Url.IsLocalUrl(returnUrl) 

그 같은거야. 어떻게 해결할 수 있을까요? 어떻게 테스트 할 수 있습니까? Selenium 또는 Moq와의 통합 테스트를 작성할 수도 있지만 Azure로 테스트하는 방법을 모르겠습니다. 어떤 아이디어이 문제에 접근하는 방법?

+0

정적 클래스 테스트는 어렵습니다. 이러한 객체에 대한 인터페이스를 사용할 수 있습니까? 그런 다음 인터페이스를 조롱하십시오. – Joe

+0

예제를 사용할 수 있습니까? 나는 그것을하는 어떤 유용한보기든지 찾아 내지 않는다. – FrEaKmAn

답변

0

FormsAuthentication & URL 클래스 용 모의 객체를 만들어야하는 것처럼 보입니다. 정적 메서드 인 것처럼 보이므로 호출 할 인터페이스로 사용법을 래핑해야하며 테스트에서는 동일한 인터페이스를 구현하는 모의 클래스를 사용하지만 해당 인터페이스에 필요한 조롱 된 결과를 반환합니다. 테스트가 실행됩니다.


(정적 메서드 here을 조롱에 대한 자세한 내용은) 이것은 당신이 윈저 성처럼, 컨트롤러의 종속성을 주입하는 IoC 컨테이너를 사용하는 경우 할 일이 많이 쉬워졌습니다.
(윈저 성 컨테이너 here에 대해 읽을 수 있습니다.)

관련 문제