【问题标题】:Getting a "No default module defined for this application" exception while running controller unit tests in zend framework在 zend 框架中运行控制器单元测试时出现“没有为此应用程序定义默认模块”异常
【发布时间】:2015-05-28 03:17:25
【问题描述】:

我有一个具有默认目录结构的应用程序,用于没有自定义模块的应用程序(参见最后的结构图)。

我已经按照许多教程中的说明编写了一个 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';

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

    }
}

【问题讨论】:

    标签: exception zend-framework phpunit


    【解决方案1】:

    这是一个已知的错误。
    这是我解决此问题的解决方法:

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

    【讨论】:

    • 实际上,我使用的是zend framework 1.10.2,所以你说的这个bug根本不存在——你确实引导我找到了解决方案,那就是我是缺少 appBootstrap 方法中的 $this->_application->bootstrap() 调用。请编辑您的答案以删除对错误的引用,因为事实并非如此。谢谢
    • 我现在是 1.10.6 但我似乎仍然遇到这个错误......不知道如果我做错了什么。如果我删除该修复程序,它将失败
    • @jiewmeng 看看 Matthew 描述的设置:Testing Zend Framework Applications
    【解决方案2】:

    我的解决方案是在parent::setUp() 之后加入这一行

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

    【讨论】:

      猜你喜欢
      • 2011-04-05
      • 1970-01-01
      • 2013-09-10
      • 2013-09-27
      • 2012-09-08
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多