Zend_Controller_Router_Exception: Route default is

2019-02-22 07:27发布

问题:

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?

回答1:

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


回答2:

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.