"Класс не найден" при использовании пространств имен в 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>
И в одном из моих тестовых файлов я открываю с помощью:
namespace Application\Tests;
use Application\Dir1\File1;
class MyTest extends File1 {}
Но он продолжает говорить:
Класс 'Application\Dir1\File1' не найден
Где я иду не так?
Ответы
Ответ 1
Даже если вы используете use
, вам все равно придется включать файл, используя include
, require
, include_once
или require_once
, или используя spl_autoload_register
, чтобы включить файл, например:
spl_autoload_register(function ($class)
{
include '\lib\\' . $class . 'php';
});
При попытке использовать Application\Dir1\File1
script будет автоматически запускаться include '\lib\Application\Dir1\File1.php'
Ответ 2
Если вы установили PHPUnit с помощью Composer, вы можете использовать автозагрузчик Composers. Самый простой способ сделать это - добавить:
"autoload":{
"psr-0":{
"your-app-directory":""
}
}
to composer.json
Ответ 3
Я нашел это действительно полезным класс автозагрузчика от Jonathan Wage, который позволяет PHPUnit проверять доступ к пространствам имен из разных каталогов. В моем bootstrap.php я просто указал пространство имен и связанных модулей:
require_once 'SplClassLoader.php';
$classLoader = new SplClassLoader('Application', dirname(__FILE__) . '/../lib');
$classLoader->register();