Правильный bootstrap в TestCase для контроллеров

Наткнулся на ошибку в 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)

Работает. Приятно 😉

One thought on “Правильный bootstrap в TestCase для контроллеров

Leave a Reply

Your email address will not be published. Required fields are marked *