diff --git a/features/sanity_checks/context_initializer_instantiation.feature b/features/sanity_checks/context_initializer_instantiation.feature new file mode 100644 index 0000000..c4e5fd4 --- /dev/null +++ b/features/sanity_checks/context_initializer_instantiation.feature @@ -0,0 +1,89 @@ +Feature: instantiation of a context initializer + I want container to only keep 1 instance of context initializer + (if it's a shared service) so it can work correctly if it's stateful + + Scenario: + Given a working Symfony application with SymfonyExtension configured + And a Behat configuration containing: + """ + default: + extensions: + FriendsOfBehat\ServiceContainerExtension: + imports: + - "tests/context_initializer.yml" + + suites: + default: + contexts: + - App\Tests\SomeContext + """ + And a Behat services definition file "tests/context_initializer.yml" containing: + """ + services: + test.initializer: + class: App\Tests\CustomContextInitializer + tags: ["context.initializer", "event_dispatcher.subscriber"] + """ + And a Behat service implementation file "tests/CustomContextInitializer.php" containing: + """ + makeItPass(true); + } + + public static function getSubscribedEvents() + { + return []; + } + } + """ + And a feature file containing: + """ + Feature: + Scenario: + Then it should pass + """ + And a context file "tests/SomeContext.php" containing: + """ + shouldPass = $shouldPass; + } + + /** @Then it should pass */ + public function itShouldPass(): void + { + $actualInitializersCount = CustomContextInitializer::$counter; + assert(1 === $actualInitializersCount, "$actualInitializersCount initializers were created"); + assert($this->shouldPass === true); + } + } + """ + When I run Behat + Then it should pass diff --git a/src/ServiceContainer/SymfonyExtension.php b/src/ServiceContainer/SymfonyExtension.php index 5eac28b..2051d38 100644 --- a/src/ServiceContainer/SymfonyExtension.php +++ b/src/ServiceContainer/SymfonyExtension.php @@ -182,7 +182,7 @@ final class SymfonyExtension implements Extension { $definition = $container->findDefinition('fob_symfony.environment_handler.context_service'); foreach ($container->findTaggedServiceIds(ContextExtension::INITIALIZER_TAG) as $serviceId => $tags) { - $definition->addMethodCall('registerContextInitializer', [$container->getDefinition($serviceId)]); + $definition->addMethodCall('registerContextInitializer', [new Reference($serviceId)]); } }