Контроллер тестирования Zend Framework Zend_Controller_Exception: модуль по умолчанию не определен для этого приложения - PullRequest
2 голосов
/ 29 августа 2010

Я пытаюсь написать тест для контроллера.Я использую ОС Windows, Zend Framework и мои библиотеки находятся в C:/library, который добавляется в include_path файла php.ini.Когда я запускаю тест testLoginAction, я получаю сообщение об ошибке Нет модуля по умолчанию для приложения.Но я не использую модули вообще.Знаете ли вы, как решить эту проблему?

IndexControllerTest.php

class Controller_IndexControllerTest extends ControllerTestCase 
{
    public function testIsEverythingOK()
    {
        $this->assertTrue(true);
    }

    public function testLoginAction()
    {
            $this->dispatch('/login/index');
            $this->assertModule('default');
            $this->assertController('login');
            $this->assertAction('index');
    }
}

ControllerTestCase.php

require_once 'Zend/Application.php';
require_once 'Zend/Controller/Action.php';
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';

class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
    protected $_application;

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

    public function appBootstrap()
    {
    //       require dirname(__FILE__) . '/bootstrap.php';


        $this->front->setControllerDirectory('../application/controllers');     
        $this->_application = new Zend_Application(
        APPLICATION_ENV,
        APPLICATION_PATH . '/configs/application.ini');
        $this->_application->bootstrap();
    }   

}

My phpunit.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<phpunit bootstrap="./application/bootstrap.php"
    colors="true"
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    stopOnFailure="true"
    syntaxCheck="true">

    <!-- запускаем все тесты из корневой директории -->
    <testsuite name="Main Test Suite">
        <directory>./</directory>
    </testsuite>

        <filter>            <!-- смотрим лишь на следующие директории -->
        <whitelist>
                  <directory suffix=".php">../application</directory>
 <!--               <directory suffix=".php">../library</directory>-->
            <exclude>
                <directory suffix=".phtml">../application</directory>
                <directory>../application/forms</directory>
                <directory>../application/models</directory>                    
                <directory>../library</directory>                    
                <file>../application/Bootstrap.php</file>
            </exclude>
        </whitelist>
    </filter>
    <logging>
        <!-- логирование и создание отчета -->
        <log type="coverage-html" target="./report" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70"/>
    </logging>
</phpunit>

Мой bootstrap.php в тестах / приложении:

// 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'),
    get_include_path(),
)));

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

Мой базовый класс для тестов:

require_once 'Zend/Application.php';
require_once 'Zend/Controller/Action.php';
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';

class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
    protected $_application;

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

    public function appBootstrap()
    {
//       require dirname(__FILE__) . '/bootstrap.php';


        $this->front->setControllerDirectory('../application/controllers');     
        $this->_application = new Zend_Application(
        APPLICATION_ENV,
        APPLICATION_PATH . '/configs/application.ini');
        $this->_application->bootstrap();
    }   
}

С уважением, Олег.

Ответы [ 3 ]

0 голосов
/ 18 мая 2012

Вам необходимо изменить метод setUp () из класса ControllerTestCase после строки parent :: setUp ():

$ this-> getFrontController () -> setControllerDirectory (APPLICATION_PATH. '/ Controllers');

и удалите следующую строку из вашего метода appBoostrap:

$ this-> front-> setControllerDirectory ('../ application / controllers');

0 голосов
/ 19 февраля 2013

$this->front-> не будет работать, поскольку свойство фронт-контроллера равно $this->frontController-> или $this->getFrontController()->.

Несмотря на это, ваши тесты, вероятно, не будут работать в любом случае из-за способа загрузки. Вы настраиваете свой фронт-контроллер из файла конфигурации ini? Если да, то вам не нужно настраивать frontController в ваших тестах, вам нужно настроить загрузчик с помощью Zend_Application.

$this->bootstrap = new Zend_Application(
   'testing',
   APPLICATION_PATH . '/configs/application.ini'
);

Вам не нужно будет вызывать bootstrap() на вашем Zend_Application экземпляре, потому что Zend_Test_PHPUnit_ControllerTestCase сделает это, когда вы отправите запрос.

Итак, ваш базовый класс может выглядеть так:

class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
    public function setUp()
    {
        // Assign and instantiate in one step:
        $this->bootstrap = new Zend_Application(
            APPLICATION_ENV,
            APPLICATION_PATH . '/configs/application.ini'
        );
        parent::setUp();
    }
}

А тест вашего контроллера, расширяющий ваш базовый класс, будет выглядеть так:

class Controller_IndexControllerTest extends ControllerTestCase 
{
    public function testIsEverythingOK()
    {
        $this->assertTrue(true);
    }

    public function testLoginAction()
    {
            $this->dispatch('/login/index');
            $this->assertModule('default');
            $this->assertController('login');
            $this->assertAction('index');
    }
}

Готово.

Ресурсы

Начальная загрузка TestCase

0 голосов
/ 07 января 2012

Убедитесь, что ваш application.ini не содержит конфигурацию, такую ​​как resources.frontController.moduledirectory = APPLICATION_PATH "/modules" или resources.frontController.params.prefixDefaultModule = 1 или resources.modules[] =

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...