Поскольку вы здесь, вы, вероятно, хорошо знаете, что PHPUnit 8+ требует, чтобы общие методы шаблона, такие как setUp()
или tearDown()
имели объявление типа возвращаемого значения void
, а эти методы естественным образом нарушают все, что ниже PHP 7.1.
Хотя автоматическое обновление вашего кода для использования этих объявлений возвращаемого типа не составляет большого труда с помощью PHP-CS-Fixer или Rector, это может стать проблемой, если по каким-то неудачным (но, надеюсь, прибыльным) причинам , вы должны убедиться, что ваш код работает под PHP 7.0 или PHP 5.6, но при этом вы хотите использовать лучшие мировые версии более-менее последних версий PHPUnit.
В этом случае у вас возникнут две проблемы. Во-первых, в более новых версиях PHPUnit нет старых утверждений, но вы можете найти способ обойти это, а во-вторых, как уже упоминалось, более новые версии PHPUnit требуют объявления возвращаемого типа void
для удобных методов шаблона, и тогда вы застреваете, потому что переписывание Тесты, работающие без этих шаблонных методов, являются серьезной проблемой и могут быть даже невозможными. И тогда эта маленькая библиотека спасет вас!
composer require --dev sanmai/phpunit-legacy-adapter:"^6.4 || ^8.2.1"
Сначала обновите свои тесты, чтобы они расширялись от LegacyPHPUnitTestCase
вместо PHPUnitFrameworkTestCase
:
- class MyTest extends PHPUnitFrameworkTestCase
+ class MyTest extends LegacyPHPUnitTestCase
Затем, где вам пришлось использовать шаблонный метод setUp(): void
, используйте метод doSetUp()
, опуская все возвращаемые типы полностью обратно совместимым способом.
- protected function setUp(): void
+ protected function doSetUp()
Существуют аналогичные замены для большинства других методов шаблона:
- public static function setUpBeforeClass(): void
+ public static function doSetUpBeforeClass()
- public static function tearDownAfterClass(): void
+ public static function doTearDownAfterClass()
- protected function setUp(): void
+ protected function doSetUp()
- protected function tearDown(): void
+ protected function doTearDown()
- protected function assertPreConditions(): void
+ protected function doAssertPreConditions()
- protected function assertPostConditions(): void
+ protected function doAssertPostConditions()
Метод | Замена |
---|---|
setUpBeforeClass(): void | doSetUpBeforeClass() |
tearDownAfterClass(): void | doTearDownAfterClass() |
setUp(): void | doSetUp() |
tearDown(): void | doTearDown() |
assertPreConditions(): void | doAssertPreConditions() |
assertPostConditions(): void | doAssertPostConditions() |
Будущие версии, вероятно, будут следовать той же схеме.
Хотя эта библиотека решает самую неприятную часть проблемы, есть и другие части, для решения которых библиотека не предназначена. Например:
assertContains
со строками, а другие — нет.expectExceptionMessageRegExp
, а в других тот же метод называется expectExceptionMessageMatches
.Для этих измененных методов существуют полифилы (см. ниже), но не составит большого труда написать специальный полифил только для тех методов, которые вам нужны. Например:
public function __call ( $ method , $ args )
{
if ( $ method === ' assertStringContainsString ' ) {
$ this -> assertContains (... $ args );
}
if ( $ method === ' assertIsBool ' ) {
$ this -> assertTrue ( is_bool ( $ args [ 0 ]));
}
if ( $ method === ' expectExceptionMessageRegExp ' ) {
$ this -> expectExceptionMessageMatches (... $ args );
}
throw new InvalidArgumentException ();
}
Если для этих и других методов есть несколько модульных (и не) многоверсионных полифилов:
yoast/phpunit-polyfills
.phpunitgoodpractices/polyfill
.