LINUX.ORG.RU

[Zend Framework] Zend_Test_PHPUnit: Route default is not defined


0

1

Настраиваю связку NetBeans + PHPUnit + Zend Framework в Ubuntu. Все замечательно кроме одной ошибки при выполнении тестов вылезающей после добавления простого пользовательского маршрута. Для чистоты эксперимента приведу лог операций простого проекта созданного в консоли:

$ zf show version
Zend Framework Version: 1.11.6

$ zf create project gametest
Creating project at /path/to/gametest
Note: This command created a web project, for more information setting up your VHOST, please see docs/README

$ cd gametest/

$ zf create controller Account
Creating a controller at /path/to/gametest/application/controllers/AccountController.php
Creating an index action method in controller Account
Creating a view script for the index action method at /path/to/gametest/application/views/scripts/account/index.phtml
Creating a controller test file at /path/to/gametest/tests/application/controllers/AccountControllerTest.php
Updating project profile '/path/to/gametest/.zfproject.xml'

$ zf create action login Account
Creating an action named login inside controller at /path/to/gametest/application/controllers/AccountController.php
Creating an action test in /path/to/gametest/tests/application/controllers/AccountControllerTest.php
Updating project profile '/path/to/gametest/.zfproject.xml'
Creating a view script for the login action method at /path/to/gametest/application/views/scripts/account/login.phtml
Updating project profile '/path/to/gametest/.zfproject.xml'

Таким образом имеем проект с дополнительным loginAction() в одном контроллере Account. Настроил для проекта виртуальный хост. При запросе адреса: http://gametest/account/login в браузере отображается следующее:

View script for controller Account and script/action name login

Далее я хочу попадать на эту страницу имея укороченный адрес: http://gametest/login

Вношу свой метод в класс в файле application/Bootstrap.php следующего содержания:

public function _initMyRoutes()
{
    $frontController = Zend_Controller_Front::getInstance();
    $router = $frontController->getRouter();
        
    $route = new Zend_Controller_Router_Route_Static('login',
            array('controller' => 'Account', 'action' =>'login'));
        
    $router->addRoute('account', $route);
}

Теперь адрес http://gametest/login работает как и ожидалось.

Однако! Выполнение тестов показывает следующий результат:

$ pwd
/path/to/gametest

$ phpunit --colors --bootstrap tests/bootstrap.php tests/
PHPUnit 3.5.13 by Sebastian Bergmann.

EEE

Time: 0 seconds, Memory: 11.00Mb

There were 3 errors:

1) AccountControllerTest::testIndexAction
Zend_Controller_Router_Exception: Route default is not defined

/path/to/ZendFramework-1.11.6/library/Zend/Controller/Router/Rewrite.php:318
/path/to/ZendFramework-1.11.6/library/Zend/Controller/Router/Rewrite.php:464
/path/to/ZendFramework-1.11.6/library/Zend/Test/PHPUnit/ControllerTestCase.php:1180
/path/to/gametest/tests/application/controllers/AccountControllerTest.php:16

2) AccountControllerTest::testLoginAction
Zend_Controller_Router_Exception: Route default is not defined

/path/to/ZendFramework-1.11.6/library/Zend/Controller/Router/Rewrite.php:318
/path/to/ZendFramework-1.11.6/library/Zend/Controller/Router/Rewrite.php:464
/path/to/ZendFramework-1.11.6/library/Zend/Test/PHPUnit/ControllerTestCase.php:1180
/path/to/gametest/tests/application/controllers/AccountControllerTest.php:33

3) IndexControllerTest::testIndexAction
Zend_Controller_Router_Exception: Route default is not defined

/path/to/ZendFramework-1.11.6/library/Zend/Controller/Router/Rewrite.php:318
/path/to/ZendFramework-1.11.6/library/Zend/Controller/Router/Rewrite.php:464
/path/to/ZendFramework-1.11.6/library/Zend/Test/PHPUnit/ControllerTestCase.php:1180
/path/to/gametest/tests/application/controllers/IndexControllerTest.php:16

FAILURES!
Tests: 3, Assertions: 0, Errors: 3.

Данный пример приведен полностью, никаких дополнительных команд и правок в проект не вносилось. Думаю всё это хозяйство воспроизведется у Вас без проблем.

Собственно вопрос, что это за ошибка, и как с ней бороться? В NetBeans очень удобно работает эта связка, тесты и прочее. Развивая проект далее хотелось делать это через тестирование. И вот все застопорилось.

★★★

Ответ на: комментарий от valich

Вроде как решил

Ковырял-ковырял и доковырялся вроде...

Есть в классе AccountControllerTest метод, так он выглядит изначально (сгенерирован):

public function testLoginAction()
{
    $params = array('action' => 'login', 'controller' => 'Account', 'module' => 'default');
    $urlParams = $this->urlizeOptions($params);
    $url = $this->url($urlParams);
    $this->dispatch($url);
        
    // assertions
    $this->assertModule($urlParams['module']);
    $this->assertController($urlParams['controller']);
    $this->assertAction($urlParams['action']);
    $this->assertQueryContentContains(
        'div#view-content p',
        'View script for controller <b>' . $params['controller'] . '</b> and script/action name <b>' . $params['action'] . '</b>'
    );
}

А так я его расковырял:

public function testLoginAction()
{
    $params = array('action' => 'login', 'controller' => 'account', 'module' => 'default');
    $urlParams = $this->urlizeOptions($params);
//    $url = $this->url($urlParams); // <-- Проблемная строка
//    $this->dispatch($url);
    $this->dispatch('/account/login');
        
    // assertions
    $this->assertModule($urlParams['module']);
    $this->assertController($urlParams['controller']);
    $this->assertAction($urlParams['action']);
    $this->assertQueryContentContains(
        'div#view-content p',
        'View script for controller <b>' . ucfirst($params['controller']) . '</b> and script/action name <b>' . $params['action'] . '</b>'
    );
}

Второй вариант через тест пролезает:

$ phpunit --colors --bootstrap tests/bootstrap.php tests/ PHPUnit 3.5.13 by Sebastian Bergmann.

..

Time: 0 seconds, Memory: 12.50Mb

OK (1 tests, 4 assertions)

В коде мой комментарий «Проблемная строка», если ее раскоментировать, все возвращается к ошибке:

AccountControllerTest::testLoginAction
Zend_Controller_Router_Exception: Route default is not defined

Судя по сообщению об ошибке ассерта assertQueryContentContains, если изменить образец проверки содержимого, отрабатывает правильно.

Пока для успокоения решил, что просто лыжи не едут. Но всё-равно загадочно.

PS: Пришел к тому, что «виновата» именно строка:

$url = $this->url($urlParams);

Т.к. более никаких правок в сгенерированный код не вносил, ни в бутстрап и ни куда либо еще...

valich ★★★
() автор топика
Ответ на: комментарий от OldFornit
var_dump($this->urlizeOptions($params));

выдает

array(3) {
  ["action"]=>
  string(5) "login"
  ["controller"]=>
  string(7) "account"
  ["module"]=>
  string(7) "default"
}
valich ★★★
() автор топика
Ответ на: комментарий от valich

Эти параметры работают потов в асертах, и правильно работают:

$this->assertModule($urlParams['module']);
    $this->assertController($urlParams['controller']);
    $this->assertAction($urlParams['action']);
    $this->assertQueryContentContains(
        'div#view-content p',
        'View script for controller <b>' . ucfirst($params['controller']) . '</b> and script/action name <b>' . $params['action'] . '</b>'
    );
valich ★★★
() автор топика
Ответ на: комментарий от valich

ага. А теперь еще один хитрый финт ушами - в бутстрапе в _initMyRoutes() последней строкой вставить:

$frontController->setRouter($router);

По идее все замечательно должно заработать.

OldFornit
()
Ответ на: комментарий от OldFornit

Попробовал, ошибка осталась на месте :(

Но как я понимаю, не должно помочь.

public function _initMyRoutes()
{
    // фронт контроллер тут singleton
    // а в переменную выдана ссылка на него
    $frontController = Zend_Controller_Front::getInstance();

    // аналогично, переменная $router ссылка на объект
    $router = $frontController->getRouter();
        
    $route = new Zend_Controller_Router_Route_Static('login',
            array('controller' => 'Account', 'action' =>'login'));
        
    $router->addRoute('account', $route);
}

Т.е. мы и так работаем со ссылкой на объект, возвращать ее назад «масломасляное».

Это конечно если я правильно понимаю реализацию ООП в Пыхе...

valich ★★★
() автор топика
Ответ на: комментарий от valich

мда? Скорее всего да, должно работать.

А если попробовать маршруты в конфиге прописать?

OldFornit
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.