【问题标题】:zend framework phpunit proper way to bootstrapzend 框架 phpunit 引导的正确方法
【发布时间】:2013-03-02 00:10:02
【问题描述】:

我在打电话

$this->application->bootstrap()->run(); 

从我的测试设置函数内部,没有输出。你应该在测试环境中调用run()吗?

我的测试成功了,但前端控制器插件从未执行(这对我的应用程序来说是必需的)。输入->run() 会执行插件,但是 phpunit 只是停止并且没有输出。

我有工作测试,但我需要前端控制器插件才能在测试环境中执行。 Bootstrap 执行,但插件不执行。当他们通过->run() 时,没有输出

有什么建议吗?

编辑:添加setup() 示例

require_once realpath(__DIR__.'/../../').'/TestBackendConfiguration.php';

abstract class Controllers_Backend_BaseControllerTest extends Zend_Test_PHPUnit_ControllerTestCase {

    protected $config;
    protected $application;
    protected $users;
    protected static $iterations = 0;

    public function setUp() {
        $this->bootstrap = array($this, 'appBootstrap');
        parent::setUp();
        $this->configureUsers();
        $this->configureACL($this->users);
    }

    public function appBootstrap() {
        $this->config = new Zend_Config_Ini(CORE_PATH . '/configs/common.ini', APPLICATION_ENV, true);
        $this->config->merge(new Zend_Config_Ini(CORE_PATH . '/configs/backend.ini', APPLICATION_ENV));
        $this->config->merge(new Zend_Config_Ini(CORE_PATH . '/configs/application.ini', APPLICATION_ENV));

        // Reset bootstraps
        $this->config->bootstrap->path = CORE_PATH . '/backend/Bootstrap.php';
        $this->config->resources->frontController->controllerDirectory = CORE_PATH . '/backend/controllers';
        $this->config->resources->frontController->actionHelperPaths->Frontend_Controller_Action_Helper = CORE_PATH . '/backend/controllers/Action/Helper';
        $this->config->resources->frontController->baseUrl = "/admin";
        $this->config->resources->layout->layoutPath = CORE_PATH . '/backend/layouts/scripts';


        $this->application = new Zend_Application( APPLICATION_ENV, $this->config );

        $this->application->bootstrap()->run(); 
     }
}

调整$this->config 的原因是因为我有前端和后端相关的测试,它们需要不同的配置。他们有自己的Configuration.php 脚本,它们都声明APPLICATION_PATH,因此第二次运行的测试无法重新定义此常量,并且应用程序无法正确引导。

现在,我主要担心的是我的插件没有在测试环境中分派,这会稍微破坏我的应用程序,因为我已将数据添加到我需要访问的注册表中,但显然不存在。想法?

添加 ->run() 会调度插件,但我的测试没有输出。我的后端控制器测试都扩展了这个负责设置后端测试环境的类。

【问题讨论】:

  • 不,您不需要调用 run()。你的测试类是否扩展Zend_Test_PHPUnit_ControllerTestCase?可以发一下整个设置方法吗?
  • 当然,是的,测试类扩展了 Zend_Test_PHPUnit_ControllerTestCase。我有一个具有设置功能的基类,然后我的个人控制器测试正在扩展这个类。

标签: zend-framework phpunit bootstrapping


【解决方案1】:

我最近遇到类似的问题,终于找到了解决方案。我希望它对某人有用。

测试环境中的资源问题是引导对象在方法Zend_Application_Bootstrap_Bootstrap::run() 中被分配为FrontController 参数,但该方法从未在测试环境中执行。这就是通过引导程序获取任何资源时出错的原因(我假设您在代码中的某处使用Zend_Controller_Front::getInstance()->getParam('bootstrap'))。

帮助我的解决方法是在单元测试中手动将引导参数设置为 FrontController,如下所示:

public 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();
    // set bootstrap param
    $bootstrap = $this->application->getBootstrap();
    $front = $bootstrap->getResource('FrontController');
    $front->setParam('bootstrap', $bootstrap);
}

【讨论】:

    【解决方案2】:

    setup 方法实际上不应引导应用程序,只需创建类以允许测试执行此操作。所以我认为你需要做的就是删除这一行:

    $this->application->bootstrap()->run(); 
    

    为了安全起见,我还将在您的设置方法中移动parent::setUp(); 行,以便在函数结束时调用它(在您的两个配置方法之后)。如果这些方法依赖于引导程序,则将它们移至 appBootstrap 函数。

    【讨论】:

    • 好的,插件现在正在工作并且执行顺序正确(正在调用插件)。谢谢你。我现在面临两个问题...我的模型抱怨 Zend_Db_Table_Exception: No adapter found 而测试抱怨 Zend_Controller_Exception: No default module defined for this application 这些是引导问题吗?
    猜你喜欢
    • 2013-05-22
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多