我有一个具有默认目录结构的应用程序,对于没有自定义模块的应用程序(参见结尾图).
我已经按照许多教程中的说明编写了一个ControllerTestCase.PHP文件,并且我也创建了相应的引导文件(再次参见末尾的数字).
我编写了一些运行正常的模型测试,但是当我开始编写索引控制器测试文件时,只有一个测试,其中只有一行(“$this-> dispatch(‘/’)); “),运行PHPunit时,我得到以下异常(但浏览器浏览到相同的位置 – 一切都很好,工作):
1) IndexControllerTest::test_indexAction_noParams Zend_Controller_Exception: No default module defined for this application
为什么是这样 ?我做错了什么?
附件:
目录结构:
-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
(基本上我在模型目录中有更多的文件,但这与这个问题无关.)
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
tests / application / bootstrap.PHP文件:
<?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';
<?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'); } }
这是一个已知的错误.
以下是解决此问题的解决方法:
以下是解决此问题的解决方法:
<?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()); } } }