Извините за ваше разочарование.Причина, по которой вы видите, что OnActionExecuting
не вызывается при непосредственном вызове метода действия из модульного теста, заключается в том, что в MVC это не так.
Запрос выполняется через «конвейер», которыйчто касается этой области, состоит из ControllerActionInvoker
.Этот класс отвечает за:
- Поиск метода действия
- Вызов фильтров действия '
OnActionExecuting
метод ( примечание: ваш класс контроллера также является фильтром действия) - Вызов самого метода действия
- Вызов фильтров действия 'метод
OnActionExecuted
- Обработка результата (например, нахождение представления и его рендеринг)
В своем модульном тесте вы непосредственно вызываете шаг 3. и пропускаете все остальные шаги.В модульном тесте вы обязаны вызывать любой код установки, необходимый для работы вашего действия.
Однако это не означает, что вы должны писать модульные тесты, использующие ControllerActionInvoker
для выполнения всего конвейера.,Мы (команда MVC) уже убедились, что все части работают вместе.
Вместо этого вы должны протестировать свой конкретный код приложения.В этом случае вы можете рассмотреть возможность использования следующих модульных тестов:
- Тест, который проверяет, что при некотором вызове Url
OnActionExecuting
на вашем контроллере правильный объект Customer помещается в ViewData - Тест, который проверяет, что с учетом некоторого объекта Customer, присутствующего в ViewData, ваш метод действия возвращает соответствующий результат
Мое последнее замечание: вы должны сохранить функциональность в OnActionExecuting
.Пользовательский механизм просмотра определенно не подходит для него.