-
-
Notifications
You must be signed in to change notification settings - Fork 455
Open
Description
Pest Version
v4.3.2
PHP Version
8.4
Operation System
macOS / Linux
Description
When running tests in parallel mode (--parallel), if any test triggers an AfterLastTestMethodErrored event (e.g., errors during teardown/cleanup), Pest crashes with a TypeError:
TypeError: NunoMaduro\Collision\Adapters\Phpunit\TestResult::fromBeforeFirstTestMethodErrored():
Argument #1 ($event) must be of type PHPUnit\Event\Test\BeforeFirstTestMethodErrored,
PHPUnit\Event\Test\AfterLastTestMethodErrored given,
called in vendor/pestphp/pest/src/Support/StateGenerator.php on line 34
Root Cause
In src/Support/StateGenerator.php, the code assumes all non-Errored events from testErroredEvents() are BeforeFirstTestMethodErrored:
foreach ($testResult->testErroredEvents() as $testResultEvent) {
if ($testResultEvent instanceof Errored) {
// ... handle Errored
} else {
// @phpstan-ignore-next-line
$state->add(TestResult::fromBeforeFirstTestMethodErrored($testResultEvent));
}
}However, testErroredEvents() can also return AfterLastTestMethodErrored events, which are then incorrectly passed to fromBeforeFirstTestMethodErrored().
Suggested Fix
Add an explicit instanceof check for BeforeFirstTestMethodErrored:
use PHPUnit\Event\Test\BeforeFirstTestMethodErrored;
foreach ($testResult->testErroredEvents() as $testResultEvent) {
if ($testResultEvent instanceof Errored) {
$state->add(TestResult::fromPestParallelTestCase(
$testResultEvent->test(),
TestResult::FAIL,
$testResultEvent->throwable()
));
} elseif ($testResultEvent instanceof BeforeFirstTestMethodErrored) {
$state->add(TestResult::fromBeforeFirstTestMethodErrored($testResultEvent));
}
// AfterLastTestMethodErrored events can be skipped or handled separately
}Steps to Reproduce
- Create a test that causes an error during teardown (e.g., database constraint violation in
afterEach) - Run tests with
--parallelflag - Observe the TypeError crash
Workaround
We've created a composer patch that fixes this issue:
--- a/src/Support/StateGenerator.php
+++ b/src/Support/StateGenerator.php
@@ -10,6 +10,7 @@
use PHPUnit\Event\Code\TestDoxBuilder;
use PHPUnit\Event\Code\TestMethod;
use PHPUnit\Event\Code\ThrowableBuilder;
+use PHPUnit\Event\Test\BeforeFirstTestMethodErrored;
use PHPUnit\Event\Test\Errored;
use PHPUnit\Event\TestData\TestDataCollection;
use PHPUnit\Framework\SkippedWithMessageException;
@@ -29,10 +30,11 @@
TestResult::FAIL,
$testResultEvent->throwable()
));
- } else {
- // @phpstan-ignore-next-line
+ } elseif ($testResultEvent instanceof BeforeFirstTestMethodErrored) {
$state->add(TestResult::fromBeforeFirstTestMethodErrored($testResultEvent));
}
+ // AfterLastTestMethodErrored events are intentionally skipped
}Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels