Introduce a service in the test application that exposes driver's service container

This commit is contained in:
Kamil Kokot
2020-04-04 15:26:02 +02:00
parent 776af6cc38
commit b05304858c
3 changed files with 33 additions and 14 deletions

View File

@@ -8,6 +8,7 @@ use Behat\Behat\Context\Context;
use Behat\Mink\Mink;
use Behat\Mink\Session;
use FriendsOfBehat\SymfonyExtension\Mink\MinkParameters;
use FriendsOfBehat\SymfonyExtension\ServiceContainer\SymfonyExtension;
use Symfony\Component\BrowserKit\Client;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -15,6 +16,8 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\HttpKernel\KernelInterface;
final class FriendsOfBehatSymfonyExtensionExtension extends Extension implements CompilerPassInterface
{
@@ -22,6 +25,7 @@ final class FriendsOfBehatSymfonyExtensionExtension extends Extension implements
{
$this->provideMinkIntegration($container);
$this->registerBehatContainer($container);
$this->registerDriverBehatContainer($container);
$container->registerForAutoconfiguration(Context::class)->addTag('fob.context');
}
@@ -47,6 +51,27 @@ final class FriendsOfBehatSymfonyExtensionExtension extends Extension implements
$container->setDefinition('behat.service_container', $behatServiceContainerDefinition);
}
private function registerDriverBehatContainer(ContainerBuilder $container): void
{
$driverKernelDefinition = new Definition(KernelInterface::class, [SymfonyExtension::DRIVER_KERNEL_ID]);
$driverKernelDefinition->setFactory([new Reference('behat.service_container'), 'get']);
$driverKernelDefinition->setPublic(true);
$driverKernelDefinition->setLazy(true);
$driverServiceContainerDefinition = new Definition(ContainerInterface::class);
$driverServiceContainerDefinition->setFactory([$driverKernelDefinition, 'getContainer']);
$driverServiceContainerDefinition->setPublic(true);
$driverServiceContainerDefinition->setLazy(true);
$driverTestServiceContainerDefinition = new Definition(ContainerInterface::class, ['test.service_container']);
$driverTestServiceContainerDefinition->setFactory([$driverServiceContainerDefinition, 'get']);
$driverTestServiceContainerDefinition->setPublic(true);
$driverTestServiceContainerDefinition->setLazy(true);
$container->setDefinition('behat.driver.service_container', $driverTestServiceContainerDefinition);
$container->registerAliasForArgument('behat.driver.service_container', ContainerInterface::class, 'driver container');
}
private function provideBrowserKitIntegration(ContainerBuilder $container): void
{
if (!class_exists(Client::class) || !$container->has('test.client')) {

View File

@@ -34,7 +34,7 @@ final class SymfonyExtension implements Extension
* Kernel used by Symfony driver to isolate web container from contexts' container.
* Container is rebuilt before every request.
*/
private const DRIVER_KERNEL_ID = 'fob_symfony.driver_kernel';
public const DRIVER_KERNEL_ID = 'fob_symfony.driver_kernel';
/** @var bool */
private $minkExtensionFound = false;