Drupal 8 PHPUnit тестирует пользовательские модули - PullRequest
1 голос
/ 20 января 2020

Я пытаюсь выяснить, почему мои тесты PHPUnit терпят неудачу с помощью следующих сообщений:

PHP Warning:  Class 'PHPUnit\Framework\MockObject\Matcher\InvokedRecorder' not found in /var/www/html/core/tests/bootstrap.php on line 197

Warning: Class 'PHPUnit\Framework\MockObject\Matcher\InvokedRecorder' not found in /var/www/html/core/tests/bootstrap.php on line 197
PHP Warning:  Class 'Drupal\TestTools\PhpUnitCompatibility\PhpUnit8\HtmlOutputPrinter' not found in /var/www/html/core/tests/Drupal/Tests/Listeners/HtmlOutputPrinter.php on line 15

Warning: Class 'Drupal\TestTools\PhpUnitCompatibility\PhpUnit8\HtmlOutputPrinter' not found in /var/www/html/core/tests/Drupal/Tests/Listeners/HtmlOutputPrinter.php on line 15
PHPUnit 8.5.2 by Sebastian Bergmann and contributors.

Could not use "\Drupal\Tests\Listeners\HtmlOutputPrinter" as printer: class does not exist

Я выполнил ../vendor/bin/phpunit ../modules/custom/drupalup_fibo_test/ из основного каталога, и вышеприведенные ошибки вышли, даже если я следовал этот учебник и использованный готовый код репетиторов доступен с github .

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

Последняя строка вывод, жалующийся на HtmlOutputPrinter , можно отключить, закомментировав соответствующую строку в core / phpunit. xml.

Мои исследования привели меня к этот журнал ошибок и другие подобные проблемы, где проблемы с совместимостью PHPUnit 6 и PHP казались проблемой. Мой сайт на Drupal работает на Docker, использует PHPUnit 8.5.2 и работает PHP 7.3.13.

1 Ответ

1 голос
/ 29 января 2020

Drupal 8.8 не поддерживает PhpUnit 8 - пока.

PHPUnit 7 прекратит поддержку 7 февраля 2020

https://www.drupal.org/project/drupal/issues/3063887

Однако, если вы посмотрите на местоположение из stacktrace core/tests/bootstrap.php, вы найдете:

// PHPUnit 4 to PHPUnit 6 bridge. Tests written for PHPUnit 4 need to work on
// PHPUnit 6 with a minimum of fuss.
// @todo provided for BC; remove in Drupal 9.
class_alias(AssertionFailedError::class, '\PHPUnit_Framework_AssertionFailedError');
class_alias(Count::class, '\PHPUnit_Framework_Constraint_Count');
class_alias(Error::class, '\PHPUnit_Framework_Error');
class_alias(Warning::class, '\PHPUnit_Framework_Error_Warning');
class_alias(ExpectationFailedException::class, '\PHPUnit_Framework_ExpectationFailedException');
class_alias(Exception::class, '\PHPUnit_Framework_Exception');
class_alias(InvokedRecorder::class, '\PHPUnit_Framework_MockObject_Matcher_InvokedRecorder');
class_alias(SkippedTestError::class, '\PHPUnit_Framework_SkippedTestError');
class_alias(TestCase::class, '\PHPUnit_Framework_TestCase');
class_alias(Test::class, '\PHPUnit_Util_Test');
class_alias(Xml::class, '\PHPUnit_Util_XML');

Таким образом, вы можете просто удалить строку InvokedRecorder вручную или применить одну из патчи из номера 3063887 (см. выше).

На данный момент я создал минимальный патч только для удаления этой единственной ссылки ...

diff --git a/core/tests/bootstrap.php b/core/tests/bootstrap.php
index 467e6af6e6..ca3b579b6c 100644
--- a/core/tests/bootstrap.php
+++ b/core/tests/bootstrap.php
@@ -14,7 +14,6 @@
 use PHPUnit\Framework\Error\Warning;
 use PHPUnit\Framework\ExpectationFailedException;
 use PHPUnit\Framework\Exception;
-use PHPUnit\Framework\MockObject\Matcher\InvokedRecorder;
 use PHPUnit\Framework\SkippedTestError;
 use PHPUnit\Framework\TestCase;
 use PHPUnit\Util\Test;
@@ -194,7 +193,6 @@ class_alias(Error::class, '\PHPUnit_Framework_Error');
 class_alias(Warning::class, '\PHPUnit_Framework_Error_Warning');
 class_alias(ExpectationFailedException::class, '\PHPUnit_Framework_ExpectationFailedException');
 class_alias(Exception::class, '\PHPUnit_Framework_Exception');
-class_alias(InvokedRecorder::class, '\PHPUnit_Framework_MockObject_Matcher_InvokedRecorder');
 class_alias(SkippedTestError::class, '\PHPUnit_Framework_SkippedTestError');
 class_alias(TestCase::class, '\PHPUnit_Framework_TestCase');
 class_alias(Test::class, '\PHPUnit_Util_Test');

..., которую можно добавить до composer.json:

{
  "patches": {
    "drupal/core": {
      "Remove InvokedRecorder for PhpUnit 8": "src/patches/3063887-InvokedRecorder.patch"
    }
  }
}
...