Получение модуля по умолчанию, определенного для этого исключения приложения, при выполнении модульных тестов контроллера в zend framework

У меня есть приложение со структурой каталогов по умолчанию для приложения без пользовательских модулей (см. рисунок структуры в конце).

Я написал файл ControllerTestCase.php в соответствии с инструкциями во многих учебниках, а также создал соответствующий файл начальной загрузки (еще раз см. рисунки в конце).

Я написал несколько модельных тестов, которые работают нормально, но когда я начал писать тестовый файл контроллера индекса, содержащий только один тест и одну строку ("$this->dispatch('/');" ), я получаю следующее исключение при запуске phpunit (но при переходе в браузере в то же место - все хорошо и работает):

1) IndexControllerTest::test_indexAction_noParams
Zend_Controller_Exception: No default module defined for this application

Почему это ? Что я сделал не так ?

Приложения:
Структура каталогов:

-proj/
  -application/
    -controllers/
      -IndexController.php
      -ErrorController.php
    -config/
    -layouts/
    -models/
    -views/
      -helpers/
      -scripts/
        -error/
          -error.phtml
        -index/
          -index.phtml
    -Bootstrap.php
  -library/
  -tests/
    -application/
      -controllers/
        -IndexControllerTest.php
      -models/
      -bootstrap.php
      -ControllerTestCase.php
    -library/
    -phpunit.xml
  -public/
    -index.php

(В основном у меня есть еще несколько файлов в каталоге моделей, но это не относится к этому вопросу.)

файл application.ini:

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "My"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
resources.view[] = 
phpSettings.date.timezone = "America/Los_Angeles"

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

файл tests/application/bootstrap.php:

<?php 
error_reporting(E_ALL);
// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'), // this project' library
    get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';

require_once 'ControllerTestCase.php';

Файл ControllerTestCase.php:

<?php
require_once ('Zend/Test/PHPUnit/ControllerTestCase.php');
class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase {
    /**
     * 
     * @var Zend_Application
     */
    protected $application;

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

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

    }
}

person Doron    schedule 24.03.2010    source источник


Ответы (2)


Это известная ошибка.
Вот мой способ решения этой проблемы:

<?php
require_once 'Zend/Application.php';
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';

abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
    protected $_application;

    protected 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();

        /**
         * Fix for ZF-8193
         * http://framework.zend.com/issues/browse/ZF-8193
         * Zend_Controller_Action->getInvokeArg('bootstrap') doesn't work
         * under the unit testing environment.
         */
        $front = Zend_Controller_Front::getInstance();
        if($front->getParam('bootstrap') === null) {
            $front->setParam('bootstrap', $this->_application->getBootstrap());
        }
    }
}
person takeshin    schedule 24.03.2010
comment
На самом деле, я использую zend framework 1.10.2, поэтому этой ошибки, о которой вы говорите, вообще нет — вы привели меня к решению, а именно к тому, что мне не хватало $this-›_application- › вызов bootstrap() в методе appBootstrap. Пожалуйста, отредактируйте свой ответ, чтобы удалить ссылку на ошибку, так как это не так. Спасибо - person Doron; 25.03.2010
comment
сейчас я на 1.10.6, но, кажется, я все еще испытываю эту ошибку ... не знаю, сделал ли я что-то не так. если я удалю это исправление, оно выйдет из строя - person Jiew Meng; 07.08.2010
comment
@jiewmeng Взгляните на настройку, описанную Мэтью: Тестирование приложений Zend Framework - person takeshin; 07.08.2010

Мое решение состояло в том, чтобы включить эту строку после parent::setUp()

$this->_application->getBootstrap()->getPluginResource('frontcontroller')->init();
person Erwin Kooi    schedule 27.05.2015