Тест MVC MSpec не соответствует атрибуту [Authorize]
У меня есть тест MSpec, чтобы проверить, правильно ли моя форма auth перенаправляет неавторизованный запрос, однако тестовый вызов защищенного действия просто идет прямо к нему, не попадая при авторизации. Из того, что я читал, людям обычно требуется поддельная аутентификация для проверки действий, выполняемых с помощью тега [Authorize], поэтому я не понимаю, как это просто перейти к методу защищенного действия.
Если кто-то может помочь, это будет высоко ценится, это моя первая попытка использовать MSpec, и похоже, что это должно быть действительно полезно, я просто не могу заставить его работать!
контроллер:
[Authorize]
public class HomeController : Controller
{
public ActionResult Index()
{
return View("Index", null);
}
}
Тестовое задание:
[Subject("Login and Authentication")]
public class when_protected_page_invoked
{
private static HomeController homeController;
private static SecurityController securityController;
private static ActionResult result;
private Establish context = () =>
{
homeController = new HomeController();
securityController = new SecurityController(new SecurityService(new NHibernateRepository<User>(), new NHibernateRepository<Session>()));
};
private Because of = () => result = homeController.Index();
private It should_redirect_to_securityController = () =>
{
result.ShouldBeARedirectToRoute().And().ControllerName().ShouldEqual("Security");
};
}
Когда я запускаю тест в данный момент, он терпит неудачу, за исключением того, что возвращается ViewResult, а если я отлаживаю, он просто возвращает результат Home.Index().
1 ответ
Это нормально. Фильтры действий в этом случае не выполняются. Все, что вам нужно сделать, это вызвать метод action в вашем модульном тесте. Правильный способ для модульного тестирования это убедиться, что этот контроллер имеет атрибут Authorize:
Assert.IsTrue(typeof(HomeController).GetCustomAttributes(typeof(AuthorizeAttribute), true).Any());
Тот факт, что когда контроллер украшен атрибутом Authorize, будет перенаправлять на соответствующую страницу входа в систему, если пользователь не прошел аутентификацию, это не то, что вам следует тестировать модулем. Это часть ASP.NET MVC Framework, которую Microsoft (надеюсь) уже тщательно провела модульным тестированием.