2013-03-02 50 views
0

我打电话Zend框架PHPUnit的适当的方式来引导

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

从我的测试设置功能里,并没有输出。你应该在测试环境中拨打run()吗?

我的测试工作,但前端控制器插件从未执行(这是我的应用程序所必需的)。将->run()放入执行插件,但phpunit停止并且没有输出。

我有工作测试,但我需要前端控制器插件在测试环境中执行。引导程序执行,但插件不执行。当他们通过->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是因为我有前端和后端相关的测试,他们需要不同的configs。他们有他们自己的Configuration.php脚本,这两个脚本都声明APPLICATION_PATH,因此哪个测试运行2nd无法重新定义此const并且应用程序不能正确引导。

现在,我主要关心的是我的插件没有在测试环境中调度,这使我的应用程序有点因为我有数据添加到注册表,我需要访问,显然不存在。想法?

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

+0

不,你不应该需要调用运行()。你的测试类是否扩展了'Zend_Test_PHPUnit_ControllerTestCase'?你能发布整个设置方法吗? – 2013-03-02 11:52:54

+0

当然,是的,测试类扩展了Zend_Test_PHPUnit_ControllerTestCase。我有一个具有设置功能的基类,然后我个人的控制器测试正在扩展这个类。 – sudoyum 2013-03-02 15:33:21

回答

0

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

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

为了安全起见我还动parent::setUp();线在你的安装方法,以便它在函数(结束叫你的两个后配置方法)。如果这些方法依赖于那里的引导程序,则将它们移至appBootstrap函数。

+0

好吧,插件现在正在工作,执行的顺序是正确的(插件被称为)。谢谢你。 我现在面临两个问题...我的模型抱怨 Zend_Db_Table_Exception:没有找到适配器 并且测试抱怨 Zend_Controller_Exception:此应用程序 这些是引导问题没有定义默认模块? – sudoyum 2013-03-04 14:51:10

0

我最近面临类似的问题,终于找到了解决办法。我希望这对某个人有用。

测试环境中资源的问题是引导程序对象在方法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); 
}