From 7aed961d4e65ce2f0ef9f799dedb890dffe7c5ef Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Tue, 25 Feb 2025 16:31:35 +0100 Subject: [PATCH 1/2] Refactor --- src/Event/Value/Test/TestMethodBuilder.php | 12 ++---------- src/Util/Test.php | 19 +++++++++++++++++++ ...d-builder-cannot-find-testcase-object.phpt | 2 +- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/Event/Value/Test/TestMethodBuilder.php b/src/Event/Value/Test/TestMethodBuilder.php index e12a89734ee..33d7e73197e 100644 --- a/src/Event/Value/Test/TestMethodBuilder.php +++ b/src/Event/Value/Test/TestMethodBuilder.php @@ -9,10 +9,7 @@ */ namespace PHPUnit\Event\Code; -use const DEBUG_BACKTRACE_IGNORE_ARGS; -use const DEBUG_BACKTRACE_PROVIDE_OBJECT; use function assert; -use function debug_backtrace; use function is_numeric; use PHPUnit\Event\TestData\DataFromDataProvider; use PHPUnit\Event\TestData\DataFromTestDependency; @@ -21,6 +18,7 @@ use PHPUnit\Metadata\Parser\Registry as MetadataRegistry; use PHPUnit\Util\Exporter; use PHPUnit\Util\Reflection; +use PHPUnit\Util\Test as TestUtil; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit @@ -53,13 +51,7 @@ public static function fromTestCase(TestCase $testCase): TestMethod */ public static function fromCallStack(): TestMethod { - foreach (debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS) as $frame) { - if (isset($frame['object']) && $frame['object'] instanceof TestCase) { - return $frame['object']->valueObjectForEvents(); - } - } - - throw new NoTestCaseObjectOnCallStackException; + return TestUtil::currentTestCase()->valueObjectForEvents(); } private static function dataFor(TestCase $testCase): TestDataCollection diff --git a/src/Util/Test.php b/src/Util/Test.php index b3d9ed54625..bcc2f371bbc 100644 --- a/src/Util/Test.php +++ b/src/Util/Test.php @@ -9,7 +9,12 @@ */ namespace PHPUnit\Util; +use const DEBUG_BACKTRACE_IGNORE_ARGS; +use const DEBUG_BACKTRACE_PROVIDE_OBJECT; +use function debug_backtrace; use function str_starts_with; +use PHPUnit\Event\Code\NoTestCaseObjectOnCallStackException; +use PHPUnit\Framework\TestCase; use PHPUnit\Metadata\Parser\Registry; use ReflectionMethod; @@ -20,6 +25,20 @@ */ final readonly class Test { + /** + * @throws NoTestCaseObjectOnCallStackException + */ + public static function currentTestCase(): TestCase + { + foreach (debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS) as $frame) { + if (isset($frame['object']) && $frame['object'] instanceof TestCase) { + return $frame['object']; + } + } + + throw new NoTestCaseObjectOnCallStackException; + } + public static function isTestMethod(ReflectionMethod $method): bool { if (!$method->isPublic()) { diff --git a/tests/end-to-end/event/test-method-builder-cannot-find-testcase-object.phpt b/tests/end-to-end/event/test-method-builder-cannot-find-testcase-object.phpt index b7468caca4b..297aa8eb02d 100644 --- a/tests/end-to-end/event/test-method-builder-cannot-find-testcase-object.phpt +++ b/tests/end-to-end/event/test-method-builder-cannot-find-testcase-object.phpt @@ -10,6 +10,6 @@ require __DIR__ . '/../../bootstrap.php'; \PHPUnit\Event\Code\TestMethodBuilder::fromCallStack(); --EXPECTF-- -Fatal error: Uncaught PHPUnit\Event\Code\NoTestCaseObjectOnCallStackException: Cannot find TestCase object on call stack in %sTestMethodBuilder.php:%d +Fatal error: Uncaught PHPUnit\Event\Code\NoTestCaseObjectOnCallStackException: Cannot find TestCase object on call stack in %s:%d Stack trace: %a From 49dcba070dbec3883481a1f752de4706ebd344f0 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Tue, 25 Feb 2025 16:43:52 +0100 Subject: [PATCH 2/2] Closes #6139 --- .../MockObject/Runtime/Rule/Parameters.php | 10 ++++++++++ src/Framework/TestRunner/TestRunner.php | 15 --------------- tests/end-to-end/regression/5891.phpt | 2 +- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/Framework/MockObject/Runtime/Rule/Parameters.php b/src/Framework/MockObject/Runtime/Rule/Parameters.php index 5e75fe5af28..17df3f0a73a 100644 --- a/src/Framework/MockObject/Runtime/Rule/Parameters.php +++ b/src/Framework/MockObject/Runtime/Rule/Parameters.php @@ -18,6 +18,7 @@ use PHPUnit\Framework\Constraint\IsEqual; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; +use PHPUnit\Util\Test; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit @@ -105,6 +106,8 @@ private function doVerify(): bool $message .= "\nTo allow 0 or more parameters with any value, omit ->with() or use ->withAnyParameters() instead."; } + $this->incrementAssertionCount(); + throw new ExpectationFailedException( sprintf($message, $this->invocation->toString()), ); @@ -117,6 +120,8 @@ private function doVerify(): bool $other = $this->invocation->parameters()[$i]; } + $this->incrementAssertionCount(); + $parameter->evaluate( $other, sprintf( @@ -141,4 +146,9 @@ private function guardAgainstDuplicateEvaluationOfParameterConstraints(): bool return (bool) $this->parameterVerificationResult; } + + private function incrementAssertionCount(): void + { + Test::currentTestCase()->addToAssertionCount(1); + } } diff --git a/src/Framework/TestRunner/TestRunner.php b/src/Framework/TestRunner/TestRunner.php index b2150deb5fe..15e550337e2 100644 --- a/src/Framework/TestRunner/TestRunner.php +++ b/src/Framework/TestRunner/TestRunner.php @@ -182,21 +182,6 @@ public function run(TestCase $test): void ErrorHandler::instance()->disable(); - /** - * Workaround for tests that fail due to mock object expectations - * that are verified while the test is running and not after the - * test has finished running. - * - * @see https://github.com/sebastianbergmann/phpunit/issues/6138 - */ - if ($failure && - !$error && - !$incomplete && - !$skipped && - $test->numberOfAssertionsPerformed() === 0) { - $test->addToAssertionCount(1); - } - if (!$error && !$incomplete && !$skipped && diff --git a/tests/end-to-end/regression/5891.phpt b/tests/end-to-end/regression/5891.phpt index 934ea0944ae..f10afad8236 100644 --- a/tests/end-to-end/regression/5891.phpt +++ b/tests/end-to-end/regression/5891.phpt @@ -17,4 +17,4 @@ Runtime: %s Time: %s, Memory: %s MB -OK (2 tests, 2 assertions) +OK (2 tests, 4 assertions)