2010-03-24 8 views
11

Tengo una aplicación con la estructura de directorios predeterminada para una aplicación sin módulos personalizados (vea la figura de la estructura al final).Obtener una excepción de "No se definió el módulo predeterminado para esta aplicación" al ejecutar pruebas de la unidad controladora en Zend Framework

He escrito un archivo ControllerTestCase.php como se indica en muchos tutoriales, y también he creado el archivo bootstrap adecuado (una vez más, vea las figuras al final).

He escrito algunas pruebas de modelo que funcionan bien, pero cuando comencé a escribir el archivo de prueba del controlador de índice, con solo una prueba, con solo una línea ("$ this-> dispatch ('/ '); "), estoy recibiendo el siguiente excepción cuando se ejecuta PHPUnit (pero navegar con el navegador en la misma ubicación - todo es bueno y el trabajo):

1) IndexControllerTest::test_indexAction_noParams 
Zend_Controller_Exception: No default module defined for this application 

¿Por qué es esto? Qué he hecho mal ?

Apéndices:
estructura de directorios:

-proj/ 
    -application/ 
    -controllers/ 
     -IndexController.php 
     -ErrorController.php 
    -config/ 
    -layouts/ 
    -models/ 
    -views/ 
     -helpers/ 
     -scripts/ 
     -error/ 
      -error.phtml 
     -index/ 
      -index.phtml 
    -Bootstrap.php 
    -library/ 
    -tests/ 
    -application/ 
     -controllers/ 
     -IndexControllerTest.php 
     -models/ 
     -bootstrap.php 
     -ControllerTestCase.php 
    -library/ 
    -phpunit.xml 
    -public/ 
    -index.php 

(. Básicamente Tengo algunos archivos en el directorio más modelos, pero eso no es relevante para esta pregunta)

archivos application.ini :

[production] 
phpSettings.display_startup_errors = 0 
phpSettings.display_errors = 0 
includePaths.library = APPLICATION_PATH "/../library" 
bootstrap.path = APPLICATION_PATH "/Bootstrap.php" 
bootstrap.class = "Bootstrap" 
appnamespace = "My" 
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" 
resources.frontController.params.displayExceptions = 0 
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/" 
resources.view[] = 
phpSettings.date.timezone = "America/Los_Angeles" 

[staging : production] 

[testing : production] 
phpSettings.display_startup_errors = 1 
phpSettings.display_errors = 1 

[development : production] 
phpSettings.display_startup_errors = 1 
phpSettings.display_errors = 1 
resources.frontController.params.displayExceptions = 1 

pruebas/aplicación/archivo Bootstrap.php: archivo

<?php 
error_reporting(E_ALL); 
// 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'), // this project' library 
    get_include_path(), 
))); 

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

require_once 'ControllerTestCase.php'; 

ControllerTestCase.php:

<?php 
require_once ('Zend/Test/PHPUnit/ControllerTestCase.php'); 
class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase { 
    /** 
    * 
    * @var Zend_Application 
    */ 
    protected $application; 

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

    public function appBootstrap(){ 
     $this->application = new Zend_Application(APPLICATION_ENV, 
                APPLICATION_PATH . '/configs/application.ini'); 

    } 
} 

Respuesta

11

Esto es un error conocido.
Aquí está mi solución alternativa para solucionar este problema:

<?php 
require_once 'Zend/Application.php'; 
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php'; 

abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase 
{ 
    protected $_application; 

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

    public function appBootstrap() 
    { 
     $this->_application = new Zend_Application(APPLICATION_ENV, 
       APPLICATION_PATH . '/configs/application.ini' 
     ); 
     $this->_application->bootstrap(); 

     /** 
     * Fix for ZF-8193 
     * http://framework.zend.com/issues/browse/ZF-8193 
     * Zend_Controller_Action->getInvokeArg('bootstrap') doesn't work 
     * under the unit testing environment. 
     */ 
     $front = Zend_Controller_Front::getInstance(); 
     if($front->getParam('bootstrap') === null) { 
      $front->setParam('bootstrap', $this->_application->getBootstrap()); 
     } 
    } 
} 
+0

En realidad, estoy usando Zend Framework 1.10.2, por lo que este error se' Sin embargo, hablar de eso no existe, me condujo a la solución, y es que me estaba perdiendo la llamada $ this -> _ application-> bootstrap() en el método appBootstrap. Edite su respuesta para eliminar la referencia al error, ya que no es el caso. Gracias – Doron

+0

ahora estoy en 1.10.6 pero todavía sigo experimentando ese error ... no sé si hice algo mal aunque. si elimino ese arreglo, falla –

+0

@jiewmeng Eche un vistazo a la configuración descrita por Matthew: [Prueba de aplicaciones de Zend Framework] (http://www.slideshare.net/weierophinney/testing-zend-framework-applications) – takeshin

0

Mi solución fue incluir esta línea después de parent::setUp()

$this->_application->getBootstrap()->getPluginResource('frontcontroller')->init(); 
Cuestiones relacionadas