Mientras estás aquí, probablemente sepas que PHPUnit 8+ requiere métodos de plantilla comunes como setUp()
o tearDown()
para tener una declaración de tipo de retorno void
, métodos que naturalmente rompen cualquier cosa por debajo de PHP 7.1.
Aunque no es gran cosa actualizar automáticamente su código para usar esta declaración de tipo de retorno con la ayuda de PHP-CS-Fixer o Rector, podría convertirse en un problema si, por cualquier desafortunada (pero, con suerte, lucrativa) razón , debe asegurarse de que su código funcione en PHP 7.0 o PHP 5.6, mientras desea utilizar lo mejor que el mundo puede ofrecerle en las versiones más recientes de PHPUnit.
En este caso, tendrás dos problemas. Una, las versiones más nuevas de PHPUnit no tienen afirmaciones antiguas, pero puede encontrar una manera de solucionar esto, y otra, como se mencionó, las versiones más nuevas de PHPUnit requieren declaraciones de tipo de retorno void
para los métodos de plantilla convenientes, y luego se queda atascado porque reescribe que las pruebas funcionen sin estos métodos de plantilla es una gran molestia e incluso podría ser imposible. ¡Y luego esta pequeña biblioteca viene a salvarte el día!
composer require --dev sanmai/phpunit-legacy-adapter:"^6.4 || ^8.2.1"
Primero, actualice sus pruebas para extenderlas desde LegacyPHPUnitTestCase
en lugar de PHPUnitFrameworkTestCase
:
- class MyTest extends PHPUnitFrameworkTestCase
+ class MyTest extends LegacyPHPUnitTestCase
Luego, donde tenía que usar setUp(): void
, use el método doSetUp()
, omitiendo todos los tipos de retorno de una manera totalmente compatible con versiones anteriores.
- protected function setUp(): void
+ protected function doSetUp()
Existen reemplazos similares para la mayoría de los demás métodos de plantilla:
- 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 | Reemplazo |
---|---|
setUpBeforeClass(): void | doSetUpBeforeClass() |
tearDownAfterClass(): void | doTearDownAfterClass() |
setUp(): void | doSetUp() |
tearDown(): void | doTearDown() |
assertPreConditions(): void | doAssertPreConditions() |
assertPostConditions(): void | doAssertPostConditions() |
Es probable que las versiones futuras sigan el mismo patrón.
Aunque esta biblioteca resuelve la parte más molesta del problema, hay otras partes para las que la biblioteca no fue diseñada. Por ejemplo:
assertContains
con cadenas, mientras que otras no.expectExceptionMessageRegExp
, mientras que en otras, el mismo método se llama expectExceptionMessageMatches
.Hay polirellenos para estos métodos modificados (ver más abajo), pero no debería ser gran cosa escribir un polirelleno ad hoc solo para los métodos que necesita. P.ej:
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 ();
}
Si hay varios polyfills modulares (y no) de múltiples versiones para estos y otros métodos:
yoast/phpunit-polyfills
.phpunitgoodpractices/polyfill
.