2009-03-04 2 views
7

На моем классе контроллера есть ActionFilter. Вызывается метод OnActionExecuting, когда действие контроллера вызывается в веб-приложении.Как я могу протестировать ActionFilter в ASP.NET MVC?

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

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

Есть ли способ иметь ActionFilter под названием?

ответ

9

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

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

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

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

+0

подробнее: HTTP : //stackoverflow.com/questions/10197677/how-to-test-that-a-method-argument-is-decorated-with-an-attribute – Spock

0

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

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

Type t = typeof(MyController); 
Assert.IsTrue(t.GetCustomAttributes(typeof(MyCustomAttribute)).Length > 0); 
Смежные вопросы