Подтвердить что ты не робот

Создание базового тестового класса для 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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Используйте autoload-dev

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

Цитата прямо из руководство:

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

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

Пример:

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

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

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

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

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


Если вам нужно больше понять, как все это работает, вы должны взглянуть на класс

Ответ 3

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

  • Я изменил заглавную букву 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
{
}