web-dev-qa-db-ja.com

PHPUnitで名前空間を使用すると「クラスが見つかりません」

私はPHPUnitを使い始めたばかりで、PHPファイルにアクセスするための設定に問題があります。私のアプリで使用しているディレクトリ構造は次のとおりです。

./phpunit.xml

./lib/Application/
  -> Dir1/File1.php (namespace = Application\Dir1)
  -> Dir1/File2.php
  -> Dir2/File1.php (namespace = Application\Dir2)

./tests/Application/Tests
  -> Test1.php (namespace = Application\Tests)
  -> Test2.php 

私のPhpUnit.xmlには、次のものが含まれています。

<?xml version="1.0" encoding="UTF-8"?>
<phpunit verbose="false">
  <testsuites>
      <testsuite name="Application">
          <directory>./tests/Application/Tests</directory>
      </testsuite>
  </testsuites>
  <logging>
       <log type="coverage-text" target="php://stdout" showUncoveredFiles="false"/>
       <log type="json" target="/tmp/phpunit-logfile.json"/>
  </logging>
  <filter>
        <whitelist>
            <directory suffix=".php">./lib</directory>
        </whitelist>
  </filter>
</phpunit>

そして、私のテストファイルの1つで、次のコードで開きます。

namespace Application\Tests;

use Application\Dir1\File1;

class MyTest extends File1 {}

しかし、それは言い続けます:

クラス 'Application\Dir1\File1'が見つかりません

どこがいけないの?

22
hohner

useを使用する場合でも、includerequireinclude_once、またはrequire_onceを使用して、ファイルを含める必要があります。または、 spl_autoload_register を使用して、次のようにファイルを含めます。

spl_autoload_register(function ($class)
{
    include '\lib\\' . $class . 'php';
});

次にApplication\Dir1\File1を使用しようとすると、スクリプトは自動的にinclude '\lib\Application\Dir1\File1.php'を実行します

4
MichaelRushton

Composerを使用してPHPUnitをインストールした場合は、Composersオートローダーを使用できます。これを行う最も簡単な方法は、以下を追加することです。

"autoload":{
    "psr-0":{
        "your-app-directory":""
    }
}

composer.json

26
JohnnyFaldo

私はこれが本当に便利であるとわかりました クラスオートローダー Jonathan Wageにより、PHPUnitテストが異なるディレクトリから名前空間にアクセスできるようにしています。私のbootstrap.phpで、場所と関連するモジュールの名前空間を指定しました。

require_once 'SplClassLoader.php';

$classLoader = new SplClassLoader('Application', dirname(__FILE__) . '/../lib');
$classLoader->register();
2
hohner

同じ問題がありました。私はcomposerも使用していますが、それを解決したのは次のものだけです:

  1. autoloadセクションのcomposer.jsonファイルに、ルート名前空間を含むクラスマップセクションを追加します。

    "autoload":  {
            "classmap": ["namespaceRoot/"]
    }
    
  2. 実行composer dump-autoloadコマンドを使用して、オートロードファイルを再作成します(すべてのクラスマッピングを使用して!)
2
silver