Como você está aqui, você provavelmente está ciente de que o PHPUnit 8+ requer métodos de modelo comuns como setUp()
ou tearDown()
para ter uma declaração de tipo de retorno void
, cujos métodos quebram naturalmente qualquer coisa abaixo do PHP 7.1.
Embora não seja grande coisa atualizar automaticamente seu código para usar essas declarações de tipo de retorno com a ajuda de PHP-CS-Fixer ou Rector, isso pode se tornar um problema se, por qualquer motivo infeliz (mas, esperançosamente, lucrativo) , você deve garantir que seu código esteja funcionando no PHP 7.0 ou PHP 5.6, ao mesmo tempo em que deseja usar o melhor que o mundo pode oferecer nas versões mais ou menos recentes do PHPUnit.
Neste caso, você terá dois problemas. Uma, as versões mais recentes do PHPUnit não possuem asserções antigas, mas você pode encontrar uma maneira de contornar isso, e outra, como mencionado, as versões mais recentes do PHPUnit exigem declarações de tipo de retorno void
para os métodos de modelo convenientes, e então você fica preso porque reescrever testes funcionarem sem esses métodos de modelo é uma grande dor e pode até ser impossível. E então esta pequena biblioteca chega para salvar o seu dia!
composer require --dev sanmai/phpunit-legacy-adapter:"^6.4 || ^8.2.1"
Primeiro, atualize seus testes para estender de LegacyPHPUnitTestCase
em vez de PHPUnitFrameworkTestCase
:
- class MyTest extends PHPUnitFrameworkTestCase
+ class MyTest extends LegacyPHPUnitTestCase
Então, onde você teve que usar o método setUp(): void
template, use o método doSetUp()
, omitindo todos os tipos de retorno de uma forma totalmente compatível com versões anteriores.
- protected function setUp(): void
+ protected function doSetUp()
Existem substituições semelhantes para a maioria dos outros métodos de modelo:
- 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()
Método | Substituição |
---|---|
setUpBeforeClass(): void | doSetUpBeforeClass() |
tearDownAfterClass(): void | doTearDownAfterClass() |
setUp(): void | doSetUp() |
tearDown(): void | doTearDown() |
assertPreConditions(): void | doAssertPreConditions() |
assertPostConditions(): void | doAssertPostConditions() |
Versões futuras provavelmente seguirão o mesmo padrão.
Embora esta biblioteca resolva a parte mais irritante do problema, há outras partes que a biblioteca não foi projetada para cobrir. Por exemplo:
assertContains
seja usado com strings, enquanto outras não.expectExceptionMessageRegExp
, enquanto em outras o mesmo método é chamado expectExceptionMessageMatches
.Existem polyfills para esses métodos alterados (veja abaixo), mas não deve ser um grande problema escrever um polyfill ad hoc apenas para os métodos que você precisa. Por exemplo:
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 ();
}
Se houver vários polyfills multiversão modulares (e não) para estes e outros métodos:
yoast/phpunit-polyfills
.phpunitgoodpractices/polyfill
.