Тест MVC MSpec не соответствует атрибуту [Authorize] - PullRequest
1 голос
/ 31 января 2012

У меня есть тест MSpec, чтобы проверить, правильно ли моя авторизация форм перенаправляет неавторизованный запрос, однако тестовый вызов защищенного действия просто идет прямо к нему, не будучи пойманным авторизацией. Из того, что я читал, людям обычно требуется поддельная аутентификация для проверки действий, выполняемых с помощью тега [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 Ответ

3 голосов
/ 31 января 2012

Это нормально.Фильтры действий в этом случае не выполняются.Все, что вам нужно сделать, это вызвать метод action в вашем модульном тесте.Надлежащим способом модульного тестирования является проверка того, что данный контроллер имеет атрибут Authorize:

Assert.IsTrue(typeof(HomeController).GetCustomAttributes(typeof(AuthorizeAttribute), true).Any());

Тот факт, что когда контроллер имеет атрибут Authorize, будет перенаправлен на соответствующую страницу входа, еслиПользователь не авторизован, это не то, что вы должны выполнить модульное тестирование.Это часть инфраструктуры ASP.NET MVC, которую Microsoft (надеюсь) уже тщательно провела модульным тестированием.

...