私は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'が見つかりません
どこがいけないの?
use
を使用する場合でも、include
、require
、include_once
、またはrequire_once
を使用して、ファイルを含める必要があります。または、 spl_autoload_register
を使用して、次のようにファイルを含めます。
spl_autoload_register(function ($class)
{
include '\lib\\' . $class . 'php';
});
次にApplication\Dir1\File1
を使用しようとすると、スクリプトは自動的にinclude '\lib\Application\Dir1\File1.php'
を実行します
Composerを使用してPHPUnitをインストールした場合は、Composersオートローダーを使用できます。これを行う最も簡単な方法は、以下を追加することです。
"autoload":{
"psr-0":{
"your-app-directory":""
}
}
composer.json
私はこれが本当に便利であるとわかりました クラスオートローダー Jonathan Wageにより、PHPUnitテストが異なるディレクトリから名前空間にアクセスできるようにしています。私のbootstrap.phpで、場所と関連するモジュールの名前空間を指定しました。
require_once 'SplClassLoader.php';
$classLoader = new SplClassLoader('Application', dirname(__FILE__) . '/../lib');
$classLoader->register();
同じ問題がありました。私はcomposerも使用していますが、それを解決したのは次のものだけです:
autoloadセクションのcomposer.jsonファイルに、ルート名前空間を含むクラスマップセクションを追加します。
"autoload": {
"classmap": ["namespaceRoot/"]
}
composer dump-autoload
コマンドを使用して、オートロードファイルを再作成します(すべてのクラスマッピングを使用して!)