2012-01-06 69 views
6

我试图测试一个控制器。 Zend的工具已产生了下面的代码:Zend_Controller_Router_Exception:路由默认没有定义

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的引导

<?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' 
); 

但是却始终无法和路线是正确的

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 

我已经默认的PHPUnit通过Zend的工具生成的引导,我已经设置了一些自定义路由,但默认路由仍然在应用程序上工作。什么可能是错的?

+0

是您的项目设置以模块化的布局?也不是'$ this-> view-> url()'? – nav 2012-01-06 23:37:02

+0

@nav是的,它是模块化的。 $ this-> url()它是默认值,$ this-> view-> url()返回非对象错误。 – dextervip 2012-01-06 23:42:14

回答

7

看起来像issue with the the Controller Test Case没有设置默认路由,如果自定义路由已被设置(这是一个不同于框架的行为)。

从问题的补丁:

/** 
* 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); 
} 

使用url()功能时,您必须通过true作为最后一个参数。

而不是修修补补的测试用例,你只需要添加的缺省路由的某个地方在引导过程:

$frontController->getRouter()->addDefaultRoutes(); 
+0

它解决了我的问题。谢谢:) – dextervip 2012-01-24 05:40:18

+0

@Rafael解决了我的太 - 我很高兴分享。你是否修补它,或只是在引导中添加默认路由? – 2012-01-24 23:20:48

+0

我已经添加了默认路由。我将等待zendframework团队通过应用补丁来解决问题。 – dextervip 2012-01-25 15:42:16

0

这听起来像一个典型的问题,您没有正确配置您的应用程序在引导程序,然后调用导致未定义路线的请求。在你的情况下,路线被指定为Route default

该路线可能是正确的,但只是未定义。

出于调试目的,输出您调用的$url,以便了解发生了什么。

+0

$ url它是一个空数组,我如何重定义所有默认路由呢? – dextervip 2012-01-09 04:45:58

+0

您需要为Zend Framework设置整个请求逻辑,因此运行控制器时感觉非常好。这非常尴尬和不平凡。 – hakre 2012-01-09 10:37:54