2012-04-29 3 views
1

У меня есть проект MVC4 с Azure. Я хочу написать простой тест, чтобы проверить логин пользователя. Моя Войти действие определяется какИспытание модуля с параметрами контроллера

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

У меня есть 2 проблемы, первая в том, что

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

возвращение NullReferenceException, а также

Url.IsLocalUrl(returnUrl) 

делает то же самое. Как я могу это решить? Как я могу проверить его? Я мог бы также написать интеграционный тест с Selenium или Moq, но я не уверен, как тестировать его с помощью Azure. Любые идеи, как подойти к этой проблеме?

+0

Тестирование статических классов сложно. Можете ли вы использовать интерфейсы для этих объектов? Затем издеваются над интерфейсами. – Joe

+0

Можем ли мы сделать пример? Я не нашел полезного примера, как это сделать. – FrEaKmAn

ответ

0

Кажется, вам нужно создать mocks для FormsAuthentication & Url Classes. Поскольку это похоже на статические методы, тогда вы должны обернуть их использование интерфейсом, который будет их вызывать, а в тестах просто использовать класс mock, который также реализует один и тот же интерфейс, но вернет издеваемые результаты, необходимые для тест для запуска.
(больше информации о насмехаясь статические методы here)

Это гораздо легче сделать, если вы используете контейнер IoC для введения зависимостей контроллера, как и Виндзорский замок.
(Вы можете прочитать о контейнере замка виндзора here)

Смежные вопросы