Zend_Controller_Router_Exception: Route default is not defined
Asked Answered
N

2

6

I'm trying to test a controller. Zend Tool has generated the following code:

class Default_CarrinhoControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{

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

public function testIndexAction()
{
    $params = array('action' => 'index', 'controller' => 'Carrinho', '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>'
        );
   }
}

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

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();

// Create application, bootstrap, and run
$application = new Zend_Application(
            APPLICATION_ENV,
            APPLICATION_PATH . '/configs/application.ini'
);

But it has failed and route is correct

 Default_CarrinhoControllerTest::testIndexAction()
 Zend_Controller_Router_Exception: Route default is not defined
 C:\xampp\ZendFramework-1.11.11\library\Zend\Controller\Router\Rewrite.php:318
 C:\xampp\ZendFramework-1.11.11\library\Zend\Controller\Router\Rewrite.php:469
 C:\xampp\ZendFramework-1.11.11\library\Zend\Test\PHPUnit\ControllerTestCase.php:1180
 C:\htdocs\farmaciaonline\FarmaciaOnlineWeb\tests\application\modules\default\controllers\CarrinhoControllerTest.php:16
 C:\xampp\php\PEAR\PHPUnit\Framework\TestCase.php:939
 C:\xampp\php\PEAR\PHPUnit\Framework\TestCase.php:801
 C:\xampp\php\PEAR\PHPUnit\Framework\TestResult.php:649
 C:\xampp\php\PEAR\PHPUnit\Framework\TestCase.php:748
 C:\xampp\php\PEAR\PHPUnit\Framework\TestSuite.php:772
 C:\xampp\php\PEAR\PHPUnit\Framework\TestSuite.php:745
 C:\xampp\php\PEAR\PHPUnit\Framework\TestSuite.php:705
 C:\xampp\php\PEAR\PHPUnit\TextUI\TestRunner.php:325
 C:\xampp\php\PEAR\PHPUnit\TextUI\Command.php:187
 C:\xampp\php\PEAR\PHPUnit\TextUI\Command.php:125
 C:\xampp\php\phpunit:44

I have the default phpunit generated bootstrap by zend tool, I've setted up some custom routes but the default routes are still working on the application. What could be wrong?

Necromancy answered 6/1, 2012 at 23:14 Comment(2)
Is your project setup in a modular layout? Also isnt it $this->view->url() ?Destine
@Destine Yes it is modular. $this->url() it's the default, $this->view->url() return non-object error.Necromancy
R
7

Looks like there's an issue with the the Controller Test Case not setting the default route, if custom routes have been set (this is a different behavior than the framework).

The patch from the issue:

/**
 * URL Helper
 * 
 * @param array $urlOptions
 * @param string $name
 * @param bool $reset
 * @param bool $encode
 */
public function url($urlOptions = array(), $name = null, $reset = false, $encode = true, $default = false)
{
    $frontController = $this->getFrontController();
    $router = $frontController->getRouter();
    if (!$router instanceof Zend_Controller_Router_Rewrite) {
        throw new Exception('This url helper utility function only works when the router is of type Zend_Controller_Router_Rewrite');
    }
    if ($default) {
        $router->addDefaultRoutes();
    }
    return $router->assemble($urlOptions, $name, $reset, $encode);
}

You'll need to pass true as the last argument when using the url() function.

Instead of patching the Test Case, you can just add the default routes someplace in the bootstrap process:

$frontController->getRouter()->addDefaultRoutes();
Ruthie answered 24/1, 2012 at 2:26 Comment(3)
@Rafael Solved mine too - so I'm glad to share. Did you patch it, or just add the default routes in the bootstrap?Ruthie
I've added the default routes. I will wait zendframework team solve the issue by applying the patch.Necromancy
Adding $router->addDefaultRoutes() in the application bootstrap did the trick beautifully. Thanks!Prolong
A
0

This sounds like a typical problem you have not configured your app in the bootstrap properly and then invoking a request which leads to an undefined route. In your case the route is specified as Route default.

The route might be correct but just undefined.

For debugging purposes, output the $url you invoke so you see what's going on.

Agranulocytosis answered 7/1, 2012 at 10:12 Comment(2)
$url it's a empty array, How can i redfine all default routes so?Necromancy
You need to setup the whole request logic for Zend Framework, so it feels well enough to run your controller. That's pretty awkward and non-trivial.Agranulocytosis

© 2022 - 2024 — McMap. All rights reserved.