Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Zend_测试线束中执行Zend Framework controller时设置正确的InvokeArg_Php_Unit Testing_Zend Framework - Fatal编程技术网

Php 在Zend_测试线束中执行Zend Framework controller时设置正确的InvokeArg

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中对非对象

根据邮件列表讨论,在Zend MVC控制器中访问应用程序资源的推荐方式是:

$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
,并为每个测试初始化自己的请求/响应对象。它试图成为尽可能多的单元测试,而不是功能或集成测试

为了解决您的问题,您必须告诉测试套件如何引导您的应用程序。有几种方法可以实现这一点

首先,您可以将文件分配给测试类的public
bootstrap
属性

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
{

}