0

PHP 5.3.4、Zend 1.11.11、およびPHPUnit3.7.1でWampServerを実行しています。私のプロジェクトの構造は、テストフォルダーが次のように編成されたデフォルトのZendレイアウトです。

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

間違えない限り、オートローダーがこれを処理するはずです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.iniinclude_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か?私はすでに何百もの解決策を試しましたが、私は盲目的に飛んでいたので、私は非常に近くにいて、それを知らなかったかもしれません。

4

3 に答える 3

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これで、そのディレクトリ内のすべてのテストファイルに必要はありません。それでも大まかな修正のように見えますが、何もないよりはましです。

于 2013-01-08T17:04:58.843 に答える
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ライブラリファイルを自動ロードできるようになりました。

于 2013-06-26T22:50:59.410 に答える
0

テストケースにブートストラップファイルを明示的に含める必要はありません。

インクルードパスにライブラリフォルダー(Zendライブラリを含む)が必要です。bootstrap.phpファイルがそれを担当する必要があります。

このエラーメッセージには、次の2つの理由が考えられます。

  1. phpunit.xmlは正しいbootstrap.phpを参照できませんでした。

  2. ブートストラップファイルが正しいライブラリパスを参照していません(これがここに当てはまると思います)

bootstrap.php内のインクルードパスをエコーし​​て、正しく設定されていることを確認できます。

基本的に、require_onceの前にbootstrap.phpに次の行を追加します

$includePath  = get_include_path();
echo "appPath = ".APPLICATION_PATH. "\n";
echo "includePath = $includePath \n";

includePathには、application / libraryフォルダーのエントリが必要です(2つのアプリケーションフォルダーがあることに注意してください。1つはクラスを保持し、もう1つはテストを保持します。testsディレクトリの外にあるものを参照する必要があります)

これが典型的なフォルダ構造です。

于 2014-03-24T14:25:12.107 に答える