我一直在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();
答案 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测试不正确。