Почему мой пользовательский класс TestCase не найден при выполнении тестов через PHPUnit?

#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 ) и повторите попытку запуска тестов.