Php 在Zend_测试线束中执行Zend Framework controller时设置正确的InvokeArg
根据邮件列表讨论,在Zend MVC控制器中访问应用程序资源的推荐方式是:Php 在Zend_测试线束中执行Zend Framework controller时设置正确的InvokeArg,php,unit-testing,zend-framework,Php,Unit Testing,Zend Framework,根据邮件列表讨论,在Zend MVC控制器中访问应用程序资源的推荐方式是: $this->getInvokeArg('bootstrap')->getResource('foo'); 这在生产环境中起作用(当浏览到相应的网页时)。但是,当使用Zend_Test\u PHPUnit_ControllerTestCase测试包含此代码的控制器操作时,我得到: PHP致命错误:在第12行的…/application/controllers/IndexController.PHP中对非对象
$this->getInvokeArg('bootstrap')->getResource('foo');
这在生产环境中起作用(当浏览到相应的网页时)。但是,当使用Zend_Test\u PHPUnit_ControllerTestCase
测试包含此代码的控制器操作时,我得到:
PHP致命错误:在第12行的…/application/controllers/IndexController.PHP中对非对象调用成员函数getResource()
在引入getInvokeArg
之前,测试运行得很好。问题是,我如何使访问资源的“推荐”方式在测试工具中工作
刚刚选中:$this->getFrontController()->getParam('bootstrap')->getResource('foo')
也不起作用
更新:我确实使用phpunit--bootstrap./scripts/application\u bootstrap.php…
调用了应用程序引导,我知道它执行得很好
我有:
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap();
编辑:对不起,我第一次错过了你问题的这一部分(还没有咖啡!)。我已经编辑了答案 问题在于
Zend_Test\u PHPUnit_ControllerTestCase
旨在对控制器进行单元测试。它尝试使用框架其余部分中很少的依赖项,并且不会自动运行/引导/任何(并且不知道)您的大型应用程序
基本上,getresource
不起作用,因为您的引导程序不存在
如果您查看一下Zend_Test\u PHPUnit_ControllerTestCase
,您将看到它手动设置并使用Zend_Controller\u Front
,并为每个测试初始化自己的请求/响应对象。它试图成为尽可能多的单元测试,而不是功能或集成测试
为了解决您的问题,您必须告诉测试套件如何引导您的应用程序。有几种方法可以实现这一点
首先,您可以将文件分配给测试类的publicbootstrap
属性
public $bootstrap = '/path/to/bootstrap/file.php'
对于使用Zend\u应用程序的应用程序来说,这是一个很好的选择
或者,通过提供对引导
属性的回调:
public function setUp()
{
// Use the 'start' method of a Bootstrap object instance:
$bootstrap = new Bootstrap('test');
$this->bootstrap = array($bootstrap, 'start');
parent::setUp();
}
注意:如果重写父方法,那么调用父方法setUp
非常重要
编辑2:好的,实际上您正在引导应用程序。那么,你已经做了上述工作,但仍然没有运气
我建议重写TestCase的dispatch
方法,以确保它正在接收引导。(这肯定有用)
想一想,您可能也可以在设置中这样做
这将允许测试套件正确模拟由Zend_应用程序构建的前端控制器的行为。这两种访问引导的方法现在都应该可以使用了。我在使用需要引导的控制器插件时遇到了相同的问题
基本上我创建了一个抽象类并从中继承
abstract class My_ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
protected $application;
public function setUp()
{
$this->bootstrap = array($this, 'appBootstrap');
return parent::setUp();
}
public function appBootstrap()
{
$this->application = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/config/app.ini');
$this->application->bootstrap();
$bootstrap = $this->application->getBootstrap();
$front = $bootstrap->getResource('FrontController');
$front->setParam('bootstrap', $bootstrap);
}
}
然后,您可以按如下方式使用:
class MyControllerTest extends My_ControllerTestCase
{
}
我还记录了一个请求,希望该功能成为ZF的一部分
[ZF-7373]:()-
留下评论将有助于强调这一点以供纳入。jason,我测试什么并不重要。在一个测试用例中,只要一次“调度”,启动被测试的控制器操作,就会触发问题。零资产。该控制器在生产环境中运行良好,但在Zend_Test/PHPUnit下崩溃。破坏性代码在Zend_controller_Action的子类中—一个控制器,而不是在测试用例中Jason,我确实调用了引导例程:PHPUnit--bootstrap./scripts/application_bootstrap.php,我确信它运行(通过$application->bootstrap();),因为所有的资源都可以通过Zend_注册中心获得,我把东西放在init上。谢谢这个解决方案。我花了几个小时思考这是我的测试引导本身的问题。Zend_测试确实需要更好的文档,尤其是与Zend_应用程序相关的文档。
class MyControllerTest extends My_ControllerTestCase
{
}