2010-03-24 6 views
11

Ho un'applicazione con la struttura di directory predefinita, per un'applicazione senza moduli personalizzati (vedere la figura della struttura alla fine).Ottenere un'eccezione "Nessun modulo predefinito definito per questa applicazione" durante l'esecuzione dei test dell'unità di controllo in zend framework

Ho scritto un file ControllerTestCase.php come indicato in molti tutorial, e ho creato anche il file di bootstrap appropriato (ancora una volta, vedi figure alla fine).

Ho scritto alcuni test del modello che funzionano bene, ma quando ho iniziato a scrivere il file di test del controller dell'indice, con un solo test al suo interno, con solo una riga ("$ this-> dispatch ('/ '); "), sto ottenendo il seguente eccezione durante l'esecuzione phpunit (ma la navigazione con il browser nella stessa posizione - tutto è buono e di lavoro):

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

perché è questo? Cosa ho fatto di sbagliato ?

Appendici:
struttura di directory:

-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 

(. Fondamentalmente ho qualche altro file nella directory modelli, ma non è rilevante per questa domanda)

di file 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 

test/applicazioni/file di bootstrap.php: file di

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

    } 
} 

risposta

11

Questo è un bug noto.
Qui è la mia soluzione per risolvere questo 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

A dire il vero, sto utilizzando Zend Framework 1.10.2, quindi questo bug' Tuttavia, non parliamo del tutto - tu mi hai guidato alla soluzione, e cioè che mi mancava la chiamata $ this -> _ application-> bootstrap() nel metodo appBootstrap. Si prega di modificare la risposta per rimuovere il riferimento al bug, in quanto non è il caso. Grazie – Doron

+0

io sono a 1.10.6 ora ma mi sembra di sperimentare ancora quel bug ... non so se ho fatto qualcosa di sbagliato tho. se rimuovo quella correzione, fallisce –

+0

@jiewmeng Dai un'occhiata alla configurazione descritta da Matthew: [Test delle applicazioni Zend Framework] (http://www.slideshare.net/weierophinney/testing-zend-framework-applications) – takeshin

0

La mia soluzione era quella di includere questa linea dopo parent::setUp()

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