Я реорганизую тестовые наборы унаследованного php-проекта, чтобы тестировать комплекты и столкнуться с проблемой тестирования класса, который зависит от другого класса. Вот исходный макет папки для тестов.
tests/
|
+- models/
| | ClassATest.php
| | ClassBTest.php
| | ...
+- controllers/
| | ...
В настоящее время нет набора тестов. Каждый тест проводится отдельно.
Для начала реорганизации этих тестов я создаю phpunit.xml и группирую тесты по наборам, как показано ниже.
phpunit.xml
<phpunit bootstrap="...">
<testsuite name="Models">
<directory>./models</directory>
</testsuite>
...
</phpunit>
Теперь у меня проблемы. У нас есть две модели, ClassA и ClassB, в которых метод ClassB зависит от ClassA.
class ClassA
{
public function getValue(...)
{
...
}
}
class ClassB
{
public function doSomething()
{
$a = new ClassA();
$x = $a->getValue(...);
// do something with $x
...
}
}
Здесь, я думаю, мы все видим проблему, когда дело доходит до тестирования. Чтобы смоделировать ClassA :: getValue (), ClassBTest.php имеет (пере) определил ClassA, как показано ниже.
ClassBTest.php
class ClassA
{
public function getValue(...)
{
return 'a mock value';
}
}
class ClassBTest extends PHPUnit_Framework_TestCase
{
public function testDoSomething()
{
$b = new ClassB();
// Make an assertion with $b->doSomething()
}
}
Итак, когда мы тестируем каждую модель отдельно, она работает. Но при запуске в комплекте это вызывает ошибку, поскольку теперь ClassA повторно объявлен в какой-то момент запущенного процесса, а phpunit завершен.
Мой вопрос: как справиться с этой ситуацией? Я попробовал несколько вариантов.
- Удаление переопределенных классов в тестовых файлах и использование внедрения зависимостей. Этот способ не является предпочтительным, поскольку мы не хотим изменять классы модели для внедрения зависимостей.
- Использование групповой аннотации для исключения таких тестовых файлов, как ClassBTest.php и запуск исключенных файлов отдельно. Эта опция не удобна.
Можем ли мы настроить phpunit для запуска группы файлов в процессе и другой группы файлов в другом процессе? Может ли PHP загружать и выгружать класс динамически во время выполнения? Если у вас есть другие варианты, пожалуйста, предложите.
Спасибо!