Zend_Test_PHPUnit_ControllerTestCase и Zend_Layout не могут найти плагин Layout во время выполнения тестов
Я начинаю писать несколько тестовых примеров для классов контроллеров, используя Zend Framework 1.10.6 и Zend_Test_PHPUnit_ControllerTestCase. У меня проблемы с одним элементом: во время выполнения контрольных примеров Zend_Controller_Action_HelperBroker не может найти помощника действий Layout.
Вот голые кости моего теста:
require_once 'PHPUnit/Framework.php';
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';
require_once 'controllers/IndexController.php';
class Application_Controllers_IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase {
public $_application;
protected function setUp() {
$this->bootstrap = array($this, 'appBootstrap');
parent::setUp ();
}
public function appBootstrap() {
// Create application, bootstrap, but don't run
$this->_application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
$this->_application->bootstrap();
$this->getFrontController()->setParams($this->_application->getOptions())
->addControllerDirectory(APPLICATION_PATH . '/controllers');
}
public function testIndexAction() {
$this->dispatch('/index/index');
$this->assertController('index');
$this->assertAction('index');
}
}
Я получаю исключение при запуске тестового примера:
Zend_Controller_Action_Exception: Action Helper по имени Layout не найден
Когда я закомментирую две строки в классе Zend_Controller_Action_HelperBroker, чтобы попытаться найти источник этого вокруг строки 368, я получаю:
Zend_Loader_PluginLoader_Exception: плагин с именем 'Layout' не найден в реестре; используемые пути: Zend_Controller_Action_Helper_: Zend/Controller/Action/Helper/
Загрузка скриптов макета работает нормально в моем приложении при запуске, кажется, что правильный путь или реестр для Zend_Controller_Action_Helper не может быть найден при выполнении тестов под PHPUnit, и, следовательно, плагин Layout не может быть загружен.
Я проверил, что Zend установлен правильно и что Layout.php находится в правильном месте.
Есть идеи?
Del
3 ответа
В вашем appBootstrap() в конце поместите эту строку:
Zend_Controller_Action_HelperBroker::addHelper(new Zend_Layout_Controller_Action_Helper_Layout);
Мой обходной путь:
function someAction() {
// workaround for unit tests 'Action Helper by name Layout not found'
if ($this->_helper->hasHelper('layout')) {
$this->_helper->layout->disableLayout(); // disable layouts
}
...
В какой момент вы добавляете свой код макета?
Помните, что "boostraping" отличается при запуске теста PHPUnit, и что вещи, загружаемые в основное приложение, могут не работать при выполнении теста PHPUnit.