Справочная информация: Я работаю над MVC-фреймворком для некоторой практики и хочу убедиться, что все на 100% протестировано на модуле.
В настоящее время установка должна иметь экземпляр класса приложения (Ex_App
). Основной сценарий запрашивает у диспетчера / маршрутизатора имя контроллера. Это имя контроллера является именем класса, реализующего Ex_Controller
, Результат возвращается как экземпляр Ex_Dispatch_Result
, Этот результат передается Ex_App
экземпляр, использующий invokeController($dispatchResult)
функция.
И здесь происходит волшебство. Ниже приведен отрывок:
$controllerName = $dispatchResult->getControllerName();
... checks for validaty of class name ...
$controller = new $controllerName();
$controller->prepare($this);
Я использую PHPUnit для выполнения моего модульного тестирования, и могу смоделировать результат отправки, правильно проверить, работает ли проверка имени класса контроллера. Проблема в том, как проверить, называется ли метод prepare.
Я хотел бы сделать что-то похожее на:
$mockController = $this->getMockBuilder('Ex_Controller')
->setMockClassName('Invoke_Correct_Controller')
->getMock();
$mockController->expects($this->once())->method('prepare');
Однако, так как новый экземпляр Invoke_Correct_Controller
создается по вызову invokeController
не будет этим издевательством и тем самым expects()
Звонок совершенно не имеет значения.
Я мог бы сделать Ex_Dispatch_Result
класс, отвечающий за возврат контроллера и его тестирование, но перед возвратом экземпляра мне нужно будет проверить правильность имени класса и, по моему мнению, ответственность должна нести Ex_App
класс а не «тупая оболочка» Ex_Dispatch_Result
учебный класс.
Есть ли что-то, чего мне не хватает в среде PHPUnit, которую я мог бы использовать для тестирования кода, или какой-то полезный шаблон, который мог бы работать в моем случае? Я чувствую, что передача имен контроллеров масштабируется намного лучше, чем передача экземпляров контроллеров с самого начала, что требует инициализации каждого возможного контроллера. Итак, я хочу придерживаться имен и использования Ex_App
как фабрика для экземпляра контроллера.
Может быть, я просто переосмысливаю часть этой проблемы, но это иногда случается. Вот почему свежий взгляд третьей стороны часто работает 🙂
Есть несколько вещей, которые вы могли бы сделать:
Если вы хотите получить более подробный ответ, предоставьте больше примеров кода ваших классов и методов.
Других решений пока нет …