Наткнулся на ошибку в ControllerTestCase, код которого фигурирует во многих примерах для unit тестирования контроллеров в ZF. Я сам его приводил в обсуждении unit тестов на zendframework.ru. Как я понял ошибка появилась после 1.9 (хотя здесь я могу ошибаться).
Бажный TestCase выглядит вот так:
<?php /** * @see Zend_Test_PHPUnit_ControllerTestCase */ require_once 'Zend/Test/PHPUnit/ControllerTestCase.php'; abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase { /** * @var Zend_Application */ protected $_application; public function setUp() { $this->bootstrap = array($this, 'appBootstrap'); parent::setUp(); } public function appBootstrap() { $this->_application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); $this->_application->bootstrap(); } } |
Проблема в том, что при использовании такого тест кейса, в тестируемых экшенах не работает геттер для объекта Bootstrap:
$this->getInvokeArg('bootstrap'); |
На багтерекере Zend Framework я нашел несколько тикетов с описанием этой проблемы ZF-8193 и ZF-10607 (по ссылке JIRA ругается, но удалось посмотреть страницы в кеше Google)
В комментариях ко второму тикету (который создан несколько дней назад) Matthew Weier O’Phinney ответил следующее:
You’re doing it wrong.
Simply assign the Zend_Application instance to the $bootstrap property.
И показал как нужно делать правильно :).
Итак, вот пример ControllerTestCase, который работает хорошо:
<?php /** * @see Zend_Test_PHPUnit_ControllerTestCase */ require_once 'Zend/Test/PHPUnit/ControllerTestCase.php'; abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase { public function setUp() { $this->bootstrap = array($this, 'appBootstrap'); parent::setUp(); } public function appBootstrap() { $this->bootstrap = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); $this->bootstrap->bootstrap(); } } |
Или можно так:
<?php /** * @see Zend_Test_PHPUnit_ControllerTestCase */ require_once 'Zend/Test/PHPUnit/ControllerTestCase.php'; abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase { public function setUp() { $this->bootstrap = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); parent::setUp(); } } |
Запускаю тесты, которые будут фигурировал в следующем посте о деплойменте:
$ phpunit PHPUnit 3.4.13 by Sebastian Bergmann. .. Time: 0 seconds, Memory: 15.50Mb OK (2 tests, 7 assertions) |
Работает. Приятно 😉
Я смотрю, Matthew Weier O’Phinney там бессменно.