diff --git a/features/mink_integration/accessing_drivers_service_container.feature b/features/mink_integration/accessing_drivers_service_container.feature new file mode 100644 index 0000000..9bbf91c --- /dev/null +++ b/features/mink_integration/accessing_drivers_service_container.feature @@ -0,0 +1,105 @@ +Feature: Accessing driver's service container + + Background: + Given a working Symfony application with SymfonyExtension configured + And a Behat configuration containing: + """ + default: + extensions: + Behat\MinkExtension: + base_url: "http://localhost:8080/" + default_session: symfony + sessions: + symfony: + symfony: ~ + suites: + default: + contexts: + - App\Tests\SomeContext + """ + And a feature file containing: + """ + Feature: + Scenario: + Given the counter service is zeroed + When I visit the page "/hello-world" + Then the counter service should return 1 + + """ + And a context file "tests/SomeContext.php" containing: + """ + mink = $mink; + $this->container = $container; + } + + /** @Given the counter service is zeroed */ + public function counterServiceIsZeroed(): void + { + assert(0 === $this->getCounterService()->get()); + } + + /** @When I visit the page :page */ + public function visitPage(string $page): void + { + $this->mink->getSession()->visit($page); + } + + /** @Then the counter service should return :number */ + public function counterServiceShouldReturn(int $number): void + { + assert($number === $this->getCounterService()->get()); + } + + private function getCounterService(): Counter + { + return $this->container + ->get('behat.service_container') + ->get('fob_symfony.driver_kernel') + ->getContainer() + ->get('test.service_container') + ->get('App\Counter') + ; + } + } + """ + + Scenario: Injecting Mink serivce + Given a YAML services file containing: + """ + services: + App\Tests\SomeContext: + public: true + arguments: + - '@behat.mink' + - '@service_container' + """ + When I run Behat + Then it should pass + + Scenario: Autowiring and autoconfiguring Mink service + Given a YAML services file containing: + """ + services: + _defaults: + autowire: true + autoconfigure: true + + App\Tests\SomeContext: ~ + """ + When I run Behat + Then it should pass diff --git a/tests/Behat/Context/TestContext.php b/tests/Behat/Context/TestContext.php index a7f56fc..5c2ed64 100644 --- a/tests/Behat/Context/TestContext.php +++ b/tests/Behat/Context/TestContext.php @@ -92,12 +92,13 @@ CON $this->thereIsFile('src/Kernel.php', <<<'CON' 'Pigeon', ]); + $loader->load(__DIR__ . '/../config/default.yaml'); $loader->load(__DIR__ . '/../config/services.yaml'); } - protected function configureRoutes(RouteCollectionBuilder $routes) + protected function configureRoutes(RouteCollectionBuilder $routes): void { - $routes->add('/hello-world', 'kernel:helloWorld'); + $routes->add('/hello-world', 'App\Controller:helloWorld'); } } CON ); + $this->thereIsFile('src/Controller.php', <<<'CON' +counter = $counter; + } + + public function helloWorld(): Response + { + $this->counter->increase(); + + return new Response('Hello world!'); + } +} +CON + ); + + $this->thereIsFile('src/Counter.php', <<<'CON' +counter++; + } + + public function get(): int + { + return $this->counter; + } +} +CON + ); + + $this->thereIsFile('config/default.yaml', <<<'YML' +services: + App\Controller: + arguments: + - '@App\Counter' + public: true + + App\Counter: + public: false +YML + ); + $this->thereIsFile('config/services.yaml', ''); }