Тест 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 (надеюсь) уже тщательно провела модульным тестированием.

Другие вопросы по тегам