diff --git a/.psalm/baseline.xml b/.psalm/baseline.xml index 120aae67f66..545e314592c 100644 --- a/.psalm/baseline.xml +++ b/.psalm/baseline.xml @@ -739,6 +739,12 @@ $this instanceof PhptTestCase + + + getName + getName + + CodeCoverage::instance() diff --git a/src/Event/DispatchingEmitter.php b/src/Event/DispatchingEmitter.php index 27a29b2031d..2a4d14917b0 100644 --- a/src/Event/DispatchingEmitter.php +++ b/src/Event/DispatchingEmitter.php @@ -153,9 +153,13 @@ public function testPassedWithWarning(Code\Test $test, string $message): void )); } - public function testPassedButRisky(): void + public function testPassedButRisky(Code\Test $test, string $message): void { - $this->dispatcher->dispatch(new Test\PassedButRisky($this->telemetryInfo())); + $this->dispatcher->dispatch(new Test\PassedButRisky( + $this->telemetryInfo(), + $test, + $message + )); } public function testSkippedByDataProvider(Code\ClassMethod $testMethod, string $message): void diff --git a/src/Event/Emitter.php b/src/Event/Emitter.php index b5a5fb75e40..599891ef65c 100644 --- a/src/Event/Emitter.php +++ b/src/Event/Emitter.php @@ -51,7 +51,7 @@ public function testPassed(Code\Test $test): void; public function testPassedWithWarning(Code\Test $test, string $message): void; - public function testPassedButRisky(): void; + public function testPassedButRisky(Code\Test $test, string $message): void; public function testSkippedByDataProvider(Code\ClassMethod $testMethod, string $message): void; diff --git a/src/Event/Test/PassedButRisky.php b/src/Event/Test/PassedButRisky.php index f9c67eaa517..50446ab91ee 100644 --- a/src/Event/Test/PassedButRisky.php +++ b/src/Event/Test/PassedButRisky.php @@ -9,6 +9,7 @@ */ namespace PHPUnit\Event\Test; +use PHPUnit\Event\Code; use PHPUnit\Event\Event; use PHPUnit\Event\Telemetry; @@ -16,13 +17,29 @@ final class PassedButRisky implements Event { private Telemetry\Info $telemetryInfo; - public function __construct(Telemetry\Info $telemetryInfo) + private Code\Test $test; + + private string $message; + + public function __construct(Telemetry\Info $telemetryInfo, Code\Test $test, string $message) { $this->telemetryInfo = $telemetryInfo; + $this->test = $test; + $this->message = $message; } public function telemetryInfo(): Telemetry\Info { return $this->telemetryInfo; } + + public function test(): Code\Test + { + return $this->test; + } + + public function message(): string + { + return $this->message; + } } diff --git a/src/Framework/TestResult.php b/src/Framework/TestResult.php index bfc7902f5e5..1ab87b68fed 100644 --- a/src/Framework/TestResult.php +++ b/src/Framework/TestResult.php @@ -13,6 +13,7 @@ use function get_class; use Countable; use Error; +use PHPUnit\Event; use PHPUnit\Util\Printer; use Throwable; @@ -189,6 +190,15 @@ public function addFailure(Test $test, AssertionFailedError $e, float $time): vo if ($test instanceof TestCase) { $test->markAsRisky(); + + Event\Facade::emitter()->testPassedButRisky( + new Event\Code\Test( + get_class($test), + $test->getName(false), + $test->getName(true), + ), + $e->getMessage() + ); } if ($this->stopOnRisky || $this->stopOnDefect) { diff --git a/tests/_files/NullEmitter.php b/tests/_files/NullEmitter.php index 7f02379adc7..84f147a7d0f 100644 --- a/tests/_files/NullEmitter.php +++ b/tests/_files/NullEmitter.php @@ -73,7 +73,7 @@ public function testPassedWithWarning(Code\Test $test, string $message): void { } - public function testPassedButRisky(): void + public function testPassedButRisky(Code\Test $test, string $message): void { } diff --git a/tests/unit/Event/DispatchingEmitterTest.php b/tests/unit/Event/DispatchingEmitterTest.php index 7a460495c92..8951126e977 100644 --- a/tests/unit/Event/DispatchingEmitterTest.php +++ b/tests/unit/Event/DispatchingEmitterTest.php @@ -549,6 +549,13 @@ public function notify(Test\PassedWithWarning $event): void public function testTestPassedButRiskyDispatchesTestPassedButRiskyEvent(): void { + $test = new Code\Test( + self::class, + 'foo', + 'foo with data set #123' + ); + $message = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; + $subscriber = new class extends RecordingSubscriber implements Test\PassedButRiskySubscriber { public function notify(Test\PassedButRisky $event): void { @@ -569,10 +576,18 @@ public function notify(Test\PassedButRisky $event): void $telemetrySystem ); - $emitter->testPassedButRisky(); + $emitter->testPassedButRisky( + $test, + $message + ); $this->assertSame(1, $subscriber->recordedEventCount()); $this->assertInstanceOf(Test\PassedButRisky::class, $subscriber->lastRecordedEvent()); + + $event = $subscriber->lastRecordedEvent(); + + $this->assertSame($test, $event->test()); + $this->assertSame($message, $event->message()); } public function testTestSkippedByDataProviderDispatchesTestSkippedByDataProviderEvent(): void diff --git a/tests/unit/Event/Test/PassedButRiskyTest.php b/tests/unit/Event/Test/PassedButRiskyTest.php index a27cabe98b6..a7d06da746a 100644 --- a/tests/unit/Event/Test/PassedButRiskyTest.php +++ b/tests/unit/Event/Test/PassedButRiskyTest.php @@ -10,6 +10,7 @@ namespace PHPUnit\Event\Test; use PHPUnit\Event\AbstractEventTestCase; +use PHPUnit\Event\Code; /** * @covers \PHPUnit\Event\Test\PassedButRisky @@ -19,9 +20,21 @@ final class PassedButRiskyTest extends AbstractEventTestCase public function testConstructorSetsValues(): void { $telemetryInfo = self::createTelemetryInfo(); + $test = new Code\Test( + self::class, + 'foo', + 'foo with data set #123' + ); + $message = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; - $event = new PassedButRisky($telemetryInfo); + $event = new PassedButRisky( + $telemetryInfo, + $test, + $message + ); $this->assertSame($telemetryInfo, $event->telemetryInfo()); + $this->assertSame($test, $event->test()); + $this->assertSame($message, $event->message()); } }