Дразнить метод на динамически размещенном экземпляре?

Справочная информация: Я работаю над 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 как фабрика для экземпляра контроллера.

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

0

Решение

Есть несколько вещей, которые вы могли бы сделать:

  • Извлечь логику создания контроллера в отдельный класс, например ControllerFactory, а затем фиктивный экземпляр фабрики контроллера, чтобы он возвращал ваш $ mockController.
  • Извлеките логику создания контроллера, чтобы отделить метод и использовать частичное моделирование.
  • Верните $ mockController из $ dispatchResult-> getControllerName (), что, вероятно, требует пересмешивания $ dispatchResult или даже чего-то еще.

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]