在基础“tests”文件夹之外,PHPUnit无法找到Zend_Test_PHPUnit_ControllerTestCase

时间:2013-01-05 19:39:28

标签: php zend-framework phpunit

我刚刚接触到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?我已经尝试了数百种解决方案,但我一直在盲目飞行,所以我本来可以非常接近甚至不知道它。

3 个答案:

答案 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文件应该对此负责。

此错误消息有两个可能的原因:

  1. phpunit.xml无法引用正确的bootstrap.php。

  2. 引导程序文件没有引用正确的库路径(我认为这是这种情况)

  3. 您可以回显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是典型的文件夹结构。