Создание базового тестового класса для PHPUnit и расширение его для общей функциональности приводит к ошибке, не найденной классом

Я запускаю PHPUnit, используя загрузочный файл для автозагрузки классов (созданных композитором).

Все мои тесты загружают классы просто отлично, но для двух моих тестов я создал «базовый» тестовый класс, который расширяет PHPUnit_Framework_TestCase, а затем два тестовых класса, которые расширяют базовый класс, аналогичную структуру по следующему примеру кода:

abstract class BaseTest extends PHPUnit_Framework_TestCase { abstract function setUp(); protected function getCommonTestVariables() { // ... } protected function runCommonTests() { // ... } } 
 class BlahBlahTest extends BaseTest { public function setUp() { $variables=$this->getCommonTestVariables(); //etc... } public function testThings() { $this->runCommonTests(); } } 

Всякий раз, когда я запускаю это, PHPUnit дает ошибку:

Неустранимая ошибка: Class 'BaseTest' не найден в BlahBlahTest.php в строке 13

Я проверил имена файлов, местоположения, пространства имен и все, кажется, в порядке. Любая помощь будет оценена, чтобы понять

Я столкнулся с той же проблемой, и если вы не слишком хорошо знакомы с внутренней работой PHPUnit и Composer, это может показаться озадачивающим.

PHPunit не использует автозагрузчик Composer для поиска любого из ваших тестовых классов. Он просто сканирует любой каталог, который вы ему даете, и работает по одному файлу за раз.

Следовательно, он не знает ни о каком другом классе, кроме того, в котором он работает. Именно здесь загружается файл начальной загрузки.

Если вы хотите использовать автозагрузчик Composer для загрузки других тестовых классов, вам нужно указать, где они могут найти эти тестовые классы (и, при желании, в пространстве имен).

Есть два способа сделать это:

  1. Добавьте раздел autoload-dev в ваш composer.json или
  2. Добавьте тестовый каталог в автозагрузчик композитора

Использовать autoload-dev

В разделах autoload-dev вы можете определить правила автозагрузки для целей разработки.

Цитирование непосредственно из руководства :

Классы, необходимые для запуска набора тестов, не должны включаться в основные правила автозагрузки, чтобы не загрязнять автозагрузчик в процессе производства и когда другие люди используют ваш пакет в качестве зависимости.

Поэтому неплохо полагаться на выделенный путь для модульных тестов и добавлять его в раздел autoload-dev.

Пример:

 { "autoload": { "psr-4": { "MyLibrary\\": "src/" } }, "autoload-dev": { "psr-4": { "MyLibrary\\Tests\\": "tests/" } } } 

Добавить в автозагрузчик композитора

Альтернативой было бы получить автозагрузчик композитора и add пространство для тестирования (если оно есть) и каталог, в котором живут ваши тесты. Как это сделать, как описано в руководстве (внизу раздела автозагрузки в разделе «Основное использование»):

 $loader = require('/path/to/vendor/autoload.php'); $loader->add('Test\\', __DIR__ . '/Tests'); 

Если в ваших тестах используются пространства имен, которые отражают тестовый каталог, и у вас все еще возникают проблемы, вы можете попробовать отказаться от префикса, заменив первый параметр ( 'Test\\' ) на '' .


Если вы хотите получить более полное представление о том, как все это работает, вы должны взглянуть на класс Composer ClassLoader , особенно методы add() и findFile() .

Я не уверен, что вам все еще нужно решение, но это сработало для меня:
Не тестируемый базовый класс, расширяющий PHPUnit_Framework_TestCase

Для меня решение было намного проще.

  1. Я изменил прописную букву Test чтобы test в конце файла и имя класса

BaseSomethingtest.php

 <?php namespace Something\Tests\Sub1\Sub2; class BaseSomethingtest { } 
  1. Я просто положил слово в конце моего базового класса. Насколько он не закончил Test , phpunit не назвал его

BaseSomethingTestCase.php

 <?php namespace Something\Tests\Sub1\Sub2; class BaseSomethingTestCase { }