Настройка теста контроллера с помощью ZendFramework: проблема с автозагрузчиком - PullRequest
0 голосов
/ 28 октября 2011

Я работаю над веб-приложением с Zend Framework v1.11.0, но мне не удается настроить правильную среду тестирования для тестов контроллера.Я знаю, что уже есть много вопросов о настройке теста Zend, однако после нескольких часов исследований ни один из них не решил мою проблему.Итак, вот мой код:

Test Bootstrap:

<?php
error_reporting(E_ALL | E_STRICT);

defined('APPLICATION_PATH') || define('APPLICATION_PATH',realpath(dirname(__FILE__).'/../../application'));
define('APPLICATION_ENV', 'testing');
set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../library'), get_include_path())));

require_once ('Zend/Application.php');
require_once ('ControllerTestCase.php');

ControllerTestCase:

class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase {

  public $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();
  }
}

Простой тест:

class IndexControllerTest extends ControllerTestCase {
    public function testDefaultShouldInvokeIndexAction()
    {
        $this->dispatch('/');
        $this->assertModule('default');
        $this->assertController('index');
        $this->assertAction('index');
    }
}

При каждом запускеВ этом тесте PHPUnit генерирует фатальное сообщение об ошибке, не найдя класс в моей библиотеке, который используется в моем IndexController.Поэтому причина должна быть связана с автозагрузчиком, подумал я.После отладки я обнаружил, что тест проходит через обычную Bootstrap, через плагин Auth и так далее, и что мои библиотеки включают .Так что я понятия не имею, в чем может быть проблема PHPUnit.В браузере все работает отлично, и неконтроллерные тесты в командной строке (например, глобальные настройки) тоже работают.

Я был бы очень благодарен за любой совет, что мне нужно сделать, чтобы мои тесты контроллера работали!

edit: моя структура каталогов выглядит следующим образом (по определенным причинам я разделил свои классы на разные библиотеки)

project
 - library1
 - library2
 - project_name
    ->application
    ->library3
    ->library4
    ->tests
       ->>application
          ->>>ControllerTestCase.php
          ->>>Bootstrap.php
       ->>Controller
          ->>>IndexControllerTest.php

мои пути включения выглядят так:

set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../library3'), get_include_path())));
set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../library4'), get_include_path())));
set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../../library1'), get_include_path())));
set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../../library2'), get_include_path())));

Ответы [ 2 ]

1 голос
/ 28 октября 2011

В моем собственном классе ControllerTestCase я установил объект начальной загрузки в конструкторе вместо функции setUp.Так что для вас это означало бы изменить

public function setUp() {
    $this->bootstrap = array($this, 'appBootstrap');
    parent::setUp();
}

на

public function __construct()
{
    $this->bootstrap = new Zend_Application(
        APPLICATION_ENV,
        APPLICATION_PATH . '/configs/application.ini'
    );
}

и удалить метод appBootstrap.Это действительно единственное различие, которое я вижу между вашим кодом и моим собственным кодом.Если проблема не устранена, скорее всего, настройки вашего пути отключены.

0 голосов
/ 21 февраля 2012

Самый простой способ правильно настроить контрольный пример для Zend Controller - использовать инструмент zf. Создавая свои контроллеры с ним, вы автоматически генерируете тестовые примеры для них.

zf create controller name index-action-included[=1] module

Создает следующий загрузчик:

    defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));

set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

require_once 'Zend/Loader/Autoloader.php';

... и контроллерTestCase:

class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{

    public function setUp()
    {
        $this->bootstrap = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini');
        parent::setUp();
    }

    ....tests.........
}

Вы должны добавить пути включения в загрузчик и зарегистрировать любые пользовательские тестовые автозагрузчики с помощью spl_autoloader. Также не забудьте запустить phpunit с -c test/phpunit.xml

...