Die Tage hatte ich wieder das Vergnügen, ein Package von Scratch aufzuziehen.
Beim Konfigurieren von PHPUnit bin ich auf einen Fehler gestoßen, der in den Versionen Symfony >= 7.0 und PHPUnit >= 11.0 auftritt.
Test code or tested code did not remove its own exception handlers
Das ist kein Bug, sondern ein Hinweis, das wir unsere Tests nicht sauber aufräumen.
Was neu ist? Das PHPUnit uns darauf hinweist.
Was genau die Ursache dafür ist, kurz zusammengefasst:
- Jemand sah in PHPUnit Performance- und Debugging-Potenzial. Also wurde ein PR gestellt.
- Dinge wurden auf PHPUnit v10.5 gemerged.
- Wieder herausgenommen, weil das Debugging-Potenzial in Laravel Probleme sichtbar gemacht hatte.
- Für PHPUnit v11.0 wurde es wieder eingeplant.
- Nun stellt sich heraus, nicht nur Laravel wird auf potentielle Verbesserungen hingewiesen:
In der Symfony-Ecke findet man ein paar hilfreiche Hinweise, darum hier ein dickes Kudos an die Symfony-Community für den konstruktiven Austausch im Issue!
Ich vermute, dass es relativ zeitnah einen Fix innerhalb von Symfony geben wird (evtl. in Kombination mit einer Deprecation der phpunit-bridge??). Darum, bevor man den Workaround blind anwendet, prüft mal eben, ob das Ding schon geregelt ist.
Hier noch ein Workaround:
Beispiel: KernelTestCase
<?php
declare(strict_types=1);
namespace Smoothie\Foo\Tests;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase as SymfonyKernelTestCase;
class KernelTestCase extends SymfonyKernelTestCase
{
/**
* Ensures we clean up the error handler while shutdown.
*/
protected static function ensureKernelShutdown(): void
{
$wasBooted = static::$booted;
parent::ensureKernelShutdown();
if ($wasBooted) {
restore_exception_handler();
}
}
}
Beispiel: WebTestCase
<?php
declare(strict_types=1);
namespace Smoothie\Foo\Tests;
use PHPUnit\Framework\Attributes\After;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase as SymfonyWebTestCase;
class WebTestCase extends SymfonyWebTestCase
{
/**
* Ensures we clean up the error handler while shutdown.
*/
#[After]
public function __internalDisableErrorHandler(): void
{
restore_exception_handler();
}
}
Schreibe einen Kommentar