我刚刚接触到Zend和单元测试,所以对我来说是裸露的。我正在使用PHP 5.3.4,Zend 1.11.11和PHPUnit 3.7.1运行Wamp Server。我的项目的结构是默认的Zend布局,其中tests文件夹的组织如下:
tests/
application/
library/
bootstrap.php
phpunit.xml
IndexControllerTest.php
application/
和library/
都为空。这个基本案例适用于我当前的设置,我可以从终端运行phpunit IndexControllerTest
并且它可以毫无错误地运行测试。一旦我将IndexControllerTest.php移动到另一个位置(例如,在application/
目录中),问题就出现了。然后我从phpunit收到致命错误:
PHP Fatal error: Class 'Zend_Test_PHPUnit_ControllerTestCase' not found in
X:\Program Files (x86)\Wamp\www\Local_site\Zend\login\tests\application\IndexControllerTest.php
on line 3
现在除非我弄错了,Autoloader应该正在处理这个require()
,但是一旦我改变测试文件的位置就会出错。我试过一遍又一遍地调整phpunit.xml文件,但我不确定这是我的问题所在,还是我的bootstrap.php或我的代码。任何见解将不胜感激。甚至在正确的方向上轻推。以下是相关文件:
phpunit.xml
<phpunit bootstrap="./bootstrap.php">
<testsuites>
<testsuite name="My Project">
<directory>./tests</directory>
</testsuite>
</testsuites>
<filter>
<!-- If Zend Framework is inside your project's library, uncomment this filter -->
<whitelist>
<directory suffix=".php">/library/Zend</directory>
</whitelist>
</filter>
</phpunit>
bootstrap.php中
<?php
// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
get_include_path(),
)));
require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();
IndexControllerTest.php
<?php
class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
protected $application;
public function setUp()
{
// Assign and instantiate in one step:
$this->bootstrap = new Zend_Application(
'testing',
APPLICATION_PATH . '/configs/application.ini'
);
parent::setUp();
}
public function testTrue()
{
$this->assertTrue(true);
}
}
根据黄金互联网的其他建议,我也改变了我的php / php.ini include_path:
include_path=".;X:\Program Files (x86)\Wamp\bin\php\php5.3.4\pear;X:\Program Files (x86)\Wamp\bin\php\php5.3.4\pear\PHPUnit"
我是否需要明确包含Zend/Test/PHPUnit/ControllerTestCase.php
?我已经尝试了数百种解决方案,但我一直在盲目飞行,所以我本来可以非常接近甚至不知道它。
答案 0 :(得分:0)
管理以找到解决此问题的解决方案(尽可能简单...)。无论出于何种原因,phpunit.xml都没有引导我的bootstrap.php文件。在我在IndexControllerTest.php中声明我的类之前,所有它需要我的引导程序:
<强> IndexControllerTest 强>
require_once '/path/to/bootstrap.php';
IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
public function testTrue()
{
$this->assertTrue(true);
}
}
在每个测试文件中都需要这个,这似乎很奇怪,我相信我很快就会找到一个更永久的解决方案。希望这有助于某人。
修改强>
稍微好一点的解决方案是我将phpunit.xml文件复制到与IndexControllerTest相同的目录,并在新的phpunit.xml文件中将bootstrap="bootstrap.php"
更改为bootstrap="../bootstrap.php"
。现在该目录中的所有测试文件都不需要require_once
。仍然看起来像是一个粗略的修复,但总比没有好。
答案 1 :(得分:0)
在过去的几个小时里,我一直在努力解决这个问题,并且使用了答案,我设法提出了以下内容,并将其添加到我的应用程序/ bootstrap.php
require_once 'Zend/Loader/Autoloader/Resource.php';
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => APPLICATION_PATH,
'namespace' => '',
'resourceTypes' => array(
'cplib' => array(
'path' => 'library/CP',
'namespace' => 'CP_'
),
),
));
一旦我有了这个,我就可以自动加载正确的Zend库文件而无需手动指定它们。
答案 2 :(得分:0)
您不需要在测试用例中明确包含引导程序文件。
您需要在包含路径上拥有库文件夹(包含Zend库)。 bootstrap.php文件应该对此负责。
此错误消息有两个可能的原因:
phpunit.xml无法引用正确的bootstrap.php。
引导程序文件没有引用正确的库路径(我认为这是这种情况)
您可以回显bootstrap.php中的include路径,以确保正确设置。
基本上,在require_once
之前将以下行添加到bootstrap.php$includePath = get_include_path();
echo "appPath = ".APPLICATION_PATH. "\n";
echo "includePath = $includePath \n";
includePath应该有一个application / library文件夹的条目 (请注意,有2个应用程序文件夹。一个持有类,另一个持有测试。你应该指的是test目录之外的那个)
here是典型的文件夹结构。