Как выполнить модульное тестирование ActionFilter в ASP.NET MVC? - PullRequest
6 голосов
/ 04 марта 2009

На моем контроллере есть ActionFilter. Метод OnActionExecuting вызывается, когда в веб-приложении вызывается действие контроллера.

Теперь я вызываю Action в UnitTest:

    NiceController niceController = new NiceController();
    ActionResult result = niceController.WhateverAction();

Есть ли способ вызвать ActionFilter?

Ответы [ 2 ]

8 голосов
/ 04 марта 2009

Для того, чтобы ActionFilter вызывался автоматически, вам нужно запустить invoker action controller. Это возможно, но это означает, что среда MVC попытается выполнить результат. Это означает, что вам придется использовать макеты, чтобы заглушить выполнение результата. Опять же, это возможно, но это означает, что ваш модульный тест становится более ложным, чем реальный код. Может быть правильнее просто проверить фильтр напрямую. В конце концов, тот факт, что OnActionExecuting вызывается, является особенностью фреймворка, и вам не нужно проводить модульное тестирование самой фреймворка.

Но я думаю, что вы на самом деле говорите о том, что хотите протестировать Wh whatAction, и это действие не может работать, если не выполнен ActionFilter.

Сначала я бы задал вопросы об этом дизайне. Это правильно? Может быть. Например, разумно, чтобы действие с атрибутом Authorize могло предполагать, что при его выполнении вошел в систему пользователь. Конечно, действие должно проверить это, но презумпция безопасна. С другой стороны, действия, вероятно, не должны требовать фильтров для инициализации конкретного действия. Так что вы должны задать вопрос, но ответом на них будет то, что дизайн правильный.

В этом случае лучшее решение для модульного теста может состоять в том, чтобы вручную выполнить фильтр в модульном тесте и написать отдельный модульный тест, который доказывает, что действие имеет правильный атрибут.

0 голосов
/ 26 января 2010

написать отдельный модульный тест, который доказывает, что действие имеет правильный атрибут

Вот как вы можете написать такой юнит-тест

Type t = typeof(MyController);
Assert.IsTrue(t.GetCustomAttributes(typeof(MyCustomAttribute)).Length > 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...