#php #symfony #composer-php #phpunit #autoload
Вопрос:
Я добавил PHPUnit в свой проект Symfony, как описано в документации. Создание и запуск первого расширенного теста SymfonyBundleFrameworkBundleTestWebTestCase
не было проблемой.
Теперь я хотел бы создать пользовательский WebTestCase
подкласс, который предоставляет общие функции для других тестовых классов:
// .../projectDir/tests/BaseTestCase.php
namespace MyProjectTests;
use SymfonyBundleFrameworkBundleTestWebTestCase;
class BaseTestCase extends WebTestCase {
protected function doSomething() {}
}
// .../projectDir/tests/SomeTest.php
namespace MyProjectTests;
use MyProjectTestsBaseTestCase;
class SomeTest extends BaseTestCase {
protected function testSomething() {
$this->doSomething();
...
}
}
При запуске php bin/phpunit
я получаю ошибку «Класс не найден» :
$ php bin/phpunit
PHP Fatal error: Uncaught Error: Class 'MyProjectTestsBaseTestCase' not found in /path/to/projectDir/tests/SomeTest.php:6
Stack trace:
#0 /path/to/projectDir/vendor/phpunit/phpunit/src/Util/FileLoader.php(65): include_once()
#1 /path/to/projectDir/vendor/phpunit/phpunit/src/Util/FileLoader.php(49): PHPUnitUtilFileLoader::load('/path/to/...')
#2 /path/to/projectDir/vendor/phpunit/phpunit/src/Framework/TestSuite.php(402): PHPUnitUtilFileLoader::checkAndLoad('/path/to/...')
#3 /path/to/projectDir/vendor/phpunit/phpunit/src/Framework/TestSuite.php(530): PHPUnitFrameworkTestSuite->addTestFile('/path/to/...')
#4 /path/to/projectDir/vendor/phpunit/phpunit/src/TextUI/TestSuiteMapper.php(67): PHPUnitFrameworkTestSuite->addTestFiles(Array)
#5 /path/to/proje in /kunden/100170_47877/webpages/pockey/webpage/dev/vendor/phpunit/phpunit/src/TextUI/Command.php on line 98
Я дважды проверил имя класса, пространство имен и use
инструкцию (что не должно быть необходимым, так как оба класса находятся в одной папке/пространстве имен).
Нужно ли мне BaseTestCase
PHPUnit
как-то регистрироваться, чтобы быть допустимым суперклассом для моих тестов?
Ответ №1:
Похоже, вам не хватает объявления путей к классам для вашего тестового каталога.
Как правило, для самих тестовых классов в этом нет необходимости, так как PHPUnit загрузит тестовые файлы и прочитает классы напрямую. Но любой другой класс, на который ссылается любой из тестов, должен будет пройти через автозагрузчик. И если вы не объявили, где найти Test
пространство имен, оно попытается найти его с помощью ваших обычных файлов проекта (например, в src/
).
Добавьте autoload-dev
ключ к вашему composer.json
… например, что-то вроде этого:
{
"autoload": {
"psr-4": {
"My\Project\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"My\Project\Tests\": "tests/"
}
}
}
Сбросьте загрузчик после этого ( composer dump-autload
) и повторите попытку запуска тестов.