PHPUnit - 使用Zend Framework应用程序生成代码覆盖率报告时出现问题

时间:2011-02-23 00:43:50

标签: php unit-testing zend-framework phpunit

我一直在Google和其他各个网站上搜索这个问题几个小时但没有运气。我使用PHPUnit为Zend Framework项目创建了一些单元测试。一切顺利,直到PHPUnit代码覆盖率报告的测试为止。此时我收到以下错误:

  

生成代码覆盖率报告,这个   可能需要一点时间。致命错误:致电   到一个成员函数pushStack()上   非对象   C:\ htdocs中\ ZendFWTutorials \ ZendStorefront \库\ SF \插件\ action.php的   在第32行

此错误引用了以下代码块:

public function
dispatchLoopStartup(Zend_Controller_Request_Abstract $request) 
{
     $stack = $this->getStack();

     // category menu
     $categoryRequest = new Zend_Controller_Request_Simple();
     $categoryRequest->setControllerName('category')
                     ->setActionName('index')
                     ->setParam('responseSegment', 'categoryMain');


     // push requests into the stack
     $stack->pushStack($categoryRequest);
 }

 public function getStack()
 {
     if (null === $this->_stack) {
         $front = Zend_Controller_Front::getInstance();
         if (!$front->hasPlugin('Zend_Controller_Plugin_ActionStack'))
         {
             $stack = new Zend_Controller_Plugin_ActionStack();
             $front->registerPlugin($stack);
         } else {
             $stack = $front->getPlugin('ActionStack');
         }
         $this->_stack = $stack;

     }
     return $this->_stack;
 }

这段代码来自我没写过的库,因此可能会增加我的问题的复杂性,因为我不太可能理解发生了什么。我还不知道PHPUnit逻辑在创建代码覆盖率报告时正在做什么,所以我不知道如何解决问题。这个问题只发生在我运行PHPUnit并运行xdebug以在正常操作条件下跟踪此函数中的代码时。我有一种感觉,PHPUnit进入一个变量为null但在正常操作中$ stack和$ categoryRequest不为空的情况。

我的目录结构如下:

  

应用
  ----->自举
  ----->配置
  ----->布局
  ----->模块
  -------->店面
  -------------->控制器
  -------------->形式
  -------------->模型
  -------------->服务
  -------------->视图
  建立
  数据
  库
  -----> SF
  -----> Zend的
  公共
  -----> CSS
  ----->图像
  测试
  ----->应用
  ------------->模块
  ------------->控制器
  ------------->模型
  ---- TestHelper.php
  ---- phpunit.xml

phpunit.xml如下:

  

                        。/应用/              

<filter>
    <whitelist>
        <directory suffix=".php">../application/</directory>
        <exclude>
            <directory suffix=".phtml">../application/</directory>
            <directory suffix=".php">../library/</directory>
        </exclude>
    </whitelist>
</filter>

<logging>
    <log type="coverage-html" target="./log/report" charset="UTF-8"
    yui="true" highlight="true" lowUpperBound="50"
     

highLowerBound = “80”/&GT;                   

TestHelper.php:

<?php // set our app paths and
 environments define('BASE_PATH',
 realpath(dirname(__FILE__) . '/../'));
 define('APPLICATION_PATH', BASE_PATH .
 '/application'); define('TEST_PATH',
 BASE_PATH . '/tests');
 define('APPLICATION_ENV', 'testing');

 //include path set_include_path('.' .
 PATH_SEPARATOR . BASE_PATH .
 '/library'  . PATH_SEPARATOR .
 get_include_path());

 // set the default timezone
 date_default_timezone_set('America/Argentina/Buenos_Aires');

 require_once 'Zend/Application.php';
 $application = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/config/store.ini');

 $application->bootstrap();

2 个答案:

答案 0 :(得分:2)

在Twitter上与@derickr交谈后,我在PHP INI中使用了xdebug.auto_trace = 1来跟踪问题。问题在于这行代码:

$stack = $front->getPlugin('ActionStack');

这可以在上面名为getStack()的函数中找到。 auto_trace显示第一次运行getStack(),它正确运行。 PHPUnit导致错误显示的原因是,当它运行代码覆盖率报告时,调度程序会多次运行,从而再次输入getStack()并触发上述代码行。代码需要进行以下更改以删除错误并在内存中正确找到插件:

$stack = $front->getPlugin('Zend_Controller_Plugin_ActionStack');

现在可以正确生成代码覆盖率报告。希望这有助于为发现自己有类似错误的其他人解释问题。

-Ross

答案 1 :(得分:-3)

正确的PHPUnit测试不正确。