36

クラスを自動ロードするためのブートストラップファイル(composerによって生成された)を使用してPHPUnitを実行しています。

私のすべてのテストはクラスを問題なくロードしますが、2 つのテストでは、拡張する「基本」テスト クラスを作成し\PHPUnit\Framework\TestCase( PHPUnit_Framework_TestCasePHPUnit7 以前と同様)、次に基本クラスを拡張する 2 つのテスト クラスを作成しました。次の例と同様の構造です。コード:

    abstract class BaseTest extends \PHPUnit\Framework\TestCase
    {
        abstract function setUp();

        protected function getCommonTestVariables()
        {
            // ...
        }

        protected function runCommonTests()
        {
            // ...
        }
    }
    class BlahBlahTest extends BaseTest
    {
        public function setUp()
        {
             $variables=$this->getCommonTestVariables();
             //etc...
        }

        public function testThings()
        {
            $this->runCommonTests();
        }
    }

これを実行するたびに、PHPUnit でエラーが発生します。

致命的なエラー: クラス 'BaseTest' が BlahBlahTest.php の 13 行目に見つかりません

ファイル名、場所、名前空間を確認しましたが、すべて問題ないようです。この問題の根底にたどり着くために、どんな助けもいただければ幸いです

4

4 に答える 4

40

私は同じ問題に遭遇しました.PHPUnitとComposerの両方の内部動作にあまり慣れていない場合、これは確かに当惑するように思えるかもしれません.

PHPunit は、Composer オートローダーを使用してテスト クラスを見つけることはありません。指定したディレクトリをスキャンし、一度に 1 つのファイルを操作するだけです。

したがって、現在操作しているファイル内のクラス以外のクラスについてはわかりません。そこで、ブートストラップ ファイルの出番です。

Composer Autoloader を使用して他のテスト クラスをロードする場合は、これらのテスト クラスがどこにあるか (オプションで、どの名前空間にあるか) を指定する必要があります。

これを行うには、次の 2 つの方法があります。

  1. またはにautoload-devセクションを追加します。composer.json
  2. test ディレクトリを Composer Autoloader に追加します。

使用するautoload-dev

このautoload-devセクションでは、開発目的で自動ロード ルールを定義できます。

マニュアルから直接引用:

テスト スイートを実行するために必要なクラスは、メインのオートロード ルールに含めないでください。これは、本番環境でのオートローダーの汚染や、他の人があなたのパッケージを依存関係として使用する場合を避けるためです。

したがって、単体テスト専用のパスに依存し、それを autoload-dev セクション内に追加することをお勧めします。

例:

{
    "autoload": {
        "psr-4": { "MyLibrary\\": "src/" }
    },
    "autoload-dev": {
        "psr-4": { "MyLibrary\\Tests\\": "tests/" }
    }
}

Composer オートローダーに追加する

別の方法として、Composer Autoloader とaddテスト用の名前空間 (存在する場合)、およびテストが存在するディレクトリを取得することもできます。マニュアル(「基本的な使い方」のオートローディングセクションの下部)に記載されているように、これを行う方法は次のとおりです。

$loader = require('/path/to/vendor/autoload.php');
$loader->add('Test\\', __DIR__ . '/Tests');

テストでテスト ディレクトリをミラーリングする名前空間を使用しても問題が発生する場合は、最初のパラメーター ( 'Test\\') をに置き換えて、プレフィックスを省略してみてください''


これらすべてがどのように機能するかをさらに詳しく知りたい場合は、Composer ClassLoader クラス、特にadd()およびfindFile()メソッドを参照してください。

于 2013-11-19T14:47:09.267 に答える
-1

extends PHPUnit_Framework_TestCaseに変更されたPHP 7.0+extends \PHPUnit\Framework\TestCaseでは、これを試してください。

于 2018-07-22T15:41:26.107 に答える