From 9f8451115c0a4960aa8dd47a425e1bb405db3a04 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Thu, 18 Sep 2025 13:00:08 +0200 Subject: [PATCH 1/5] Init container also for tests without dataprovider --- src/Testing/PHPUnit/ContainerInitializer.php | 23 +++++++++++++ ...tContainerBeforeDataProviderSubscriber.php | 2 +- .../InitContainerBeforeTestSubscriber.php | 32 +++++++++++++++++++ .../PHPUnit/PHPStanPHPUnitExtension.php | 3 ++ 4 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/Testing/PHPUnit/ContainerInitializer.php create mode 100644 src/Testing/PHPUnit/InitContainerBeforeTestSubscriber.php diff --git a/src/Testing/PHPUnit/ContainerInitializer.php b/src/Testing/PHPUnit/ContainerInitializer.php new file mode 100644 index 0000000000..6c16750561 --- /dev/null +++ b/src/Testing/PHPUnit/ContainerInitializer.php @@ -0,0 +1,23 @@ + + */ + private static $initialized = []; + + static public function initialize(string $testClassName): void + { + if (array_key_exists($testClassName, self::$initialized)) { + return; + } + + $testClassName::getContainer(); + + self::$initialized[$testClassName] = true; + } +} diff --git a/src/Testing/PHPUnit/InitContainerBeforeDataProviderSubscriber.php b/src/Testing/PHPUnit/InitContainerBeforeDataProviderSubscriber.php index 525984fb4c..9a840fcb18 100644 --- a/src/Testing/PHPUnit/InitContainerBeforeDataProviderSubscriber.php +++ b/src/Testing/PHPUnit/InitContainerBeforeDataProviderSubscriber.php @@ -20,7 +20,7 @@ public function notify(DataProviderMethodCalled $event): void return; } - $testClassName::getContainer(); + ContainerInitializer::initialize($testClassName); } } diff --git a/src/Testing/PHPUnit/InitContainerBeforeTestSubscriber.php b/src/Testing/PHPUnit/InitContainerBeforeTestSubscriber.php new file mode 100644 index 0000000000..b735e78c87 --- /dev/null +++ b/src/Testing/PHPUnit/InitContainerBeforeTestSubscriber.php @@ -0,0 +1,32 @@ +test(); + if (!$test->isTestMethod()) { + // skip PHPT tests + return; + } + + $testClassName = $test->className(); + + if (!is_a($testClassName, PhpStanTestCase::class, true)) { + return; + } + + ContainerInitializer::initialize($testClassName); + } + +} diff --git a/src/Testing/PHPUnit/PHPStanPHPUnitExtension.php b/src/Testing/PHPUnit/PHPStanPHPUnitExtension.php index ff52d637b9..7a4ec99267 100644 --- a/src/Testing/PHPUnit/PHPStanPHPUnitExtension.php +++ b/src/Testing/PHPUnit/PHPStanPHPUnitExtension.php @@ -21,6 +21,9 @@ public function bootstrap( $facade->registerSubscriber( new InitContainerBeforeDataProviderSubscriber(), ); + $facade->registerSubscriber( + new InitContainerBeforeTestSubscriber(), + ); } } From 291af4b75f51ac179e27f7c4ada1fc542a98fbc6 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Thu, 18 Sep 2025 13:02:58 +0200 Subject: [PATCH 2/5] cs --- src/Testing/PHPUnit/ContainerInitializer.php | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/Testing/PHPUnit/ContainerInitializer.php b/src/Testing/PHPUnit/ContainerInitializer.php index 6c16750561..86b085a0d7 100644 --- a/src/Testing/PHPUnit/ContainerInitializer.php +++ b/src/Testing/PHPUnit/ContainerInitializer.php @@ -1,16 +1,16 @@ - - */ - private static $initialized = []; +use function array_key_exists; + +final class ContainerInitializer +{ - static public function initialize(string $testClassName): void + /** @var array */ + private static array $initialized = []; + + public static function initialize(string $testClassName): void { if (array_key_exists($testClassName, self::$initialized)) { return; @@ -20,4 +20,5 @@ static public function initialize(string $testClassName): void self::$initialized[$testClassName] = true; } + } From cf856b005bb4bd710840b3137768b4129681836a Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Thu, 18 Sep 2025 13:06:05 +0200 Subject: [PATCH 3/5] Update PHPStanPHPUnitExtension.php --- src/Testing/PHPUnit/PHPStanPHPUnitExtension.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Testing/PHPUnit/PHPStanPHPUnitExtension.php b/src/Testing/PHPUnit/PHPStanPHPUnitExtension.php index 7a4ec99267..a0f2e02817 100644 --- a/src/Testing/PHPUnit/PHPStanPHPUnitExtension.php +++ b/src/Testing/PHPUnit/PHPStanPHPUnitExtension.php @@ -18,6 +18,8 @@ public function bootstrap( ParameterCollection $parameters, ): void { + // use multiple subscribers which all initialize the test-container. + // we need to make sure we only initialize once per test-class. $facade->registerSubscriber( new InitContainerBeforeDataProviderSubscriber(), ); From 7a1862fc5ba17be89a3696112fd57890e210c353 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Thu, 18 Sep 2025 22:16:48 +0200 Subject: [PATCH 4/5] fix --- src/Testing/PHPUnit/ContainerInitializer.php | 10 +++------- src/Testing/PHPUnit/PHPStanPHPUnitExtension.php | 2 -- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/Testing/PHPUnit/ContainerInitializer.php b/src/Testing/PHPUnit/ContainerInitializer.php index 86b085a0d7..448336619f 100644 --- a/src/Testing/PHPUnit/ContainerInitializer.php +++ b/src/Testing/PHPUnit/ContainerInitializer.php @@ -2,23 +2,19 @@ namespace PHPStan\Testing\PHPUnit; +use PHPStan\DependencyInjection\InvalidIgnoredErrorExceptionTest; use function array_key_exists; final class ContainerInitializer { - - /** @var array */ - private static array $initialized = []; - public static function initialize(string $testClassName): void { - if (array_key_exists($testClassName, self::$initialized)) { + // This test expects an exception during container initialization + if ($testClassName === InvalidIgnoredErrorExceptionTest::class) { return; } $testClassName::getContainer(); - - self::$initialized[$testClassName] = true; } } diff --git a/src/Testing/PHPUnit/PHPStanPHPUnitExtension.php b/src/Testing/PHPUnit/PHPStanPHPUnitExtension.php index a0f2e02817..7a4ec99267 100644 --- a/src/Testing/PHPUnit/PHPStanPHPUnitExtension.php +++ b/src/Testing/PHPUnit/PHPStanPHPUnitExtension.php @@ -18,8 +18,6 @@ public function bootstrap( ParameterCollection $parameters, ): void { - // use multiple subscribers which all initialize the test-container. - // we need to make sure we only initialize once per test-class. $facade->registerSubscriber( new InitContainerBeforeDataProviderSubscriber(), ); From f27a4354a1673b1e5e2d626790790f09a17757bd Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Thu, 18 Sep 2025 22:17:06 +0200 Subject: [PATCH 5/5] cs --- src/Testing/PHPUnit/ContainerInitializer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Testing/PHPUnit/ContainerInitializer.php b/src/Testing/PHPUnit/ContainerInitializer.php index 448336619f..8f29c59aa9 100644 --- a/src/Testing/PHPUnit/ContainerInitializer.php +++ b/src/Testing/PHPUnit/ContainerInitializer.php @@ -3,10 +3,10 @@ namespace PHPStan\Testing\PHPUnit; use PHPStan\DependencyInjection\InvalidIgnoredErrorExceptionTest; -use function array_key_exists; final class ContainerInitializer { + public static function initialize(string $testClassName): void { // This test expects an exception during container initialization