Тестирование действия контроллера MVC с помощью ActionFilterAttribute - PullRequest
2 голосов
/ 22 января 2010

Хорошо известным преимуществом MVC является его пригодность для разработки через тестирование (TDD), поскольку вы можете напрямую вызывать действия контроллера из своих методов тестирования.

Как проверить комбинацию действия контроллера с атрибутом ActionFilter (используя OnActionExecuted для изменения ActionResult, возвращаемого действием)? Если я просто вызываю Action, он возвращает ActionResult из действия, но атрибут фильтра никогда не вызывается. Я думаю, что, может быть, вы можете получить это Controller.ActionInvoker.InvokeAction(controllerContext, "ActionName"), но вы должны точно высмеивать столько контекста controllerContext, чтобы заставить его работать, что это настоящая боль.

Кто-нибудь успешно это сделал?

Ответы [ 4 ]

2 голосов
/ 22 января 2010

Модульное тестирование - это отдельные единицы, а не их комбинация

Модульные тесты - это тестирование единой функциональности / процесса / работы. Вы должны проверить атрибут отдельно от действия контроллера.

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

  2. Затем проверьте, что ваш атрибут делает то, что должен = конвертировать результаты действий, как ожидалось.

Два отдельных модульных теста, а не один.

2 голосов
/ 22 января 2010

Я думаю, что вам лучше протестировать контроллер и атрибут (фильтр) изолированно, а затем утверждать, что действительно существует атрибут в конкретном действии (методе) контроллера.

1 голос
/ 06 января 2011

А как насчет фильтров, которые помогают контексту, в котором выполняется действие? например, фильтр, который создает сеанс nhibernate? Мне нужно будет создать это в любом тесте? но в этом и заключается идея иметь фильтр!

1 голос
/ 22 января 2010

Мы делаем что-то подобное, когда тестируем наши проверки DataAnnotation. Мы проверяем модель свойств на правильные атрибуты, используя отражение. Когда мы тестируем наши контроллеры, мы просто устанавливаем валидность модели вручную. Как упоминают и Роберт, и Антон, ваш тест должен содержать одно конкретное утверждение для одного конкретного класса.

...