Skip to content

Roave/behat-psr11extension

Repository files navigation

PSR-11 Container extension for Behat

Build Status Scrutinizer Code Quality Code Coverage Latest Stable Version License

Allows injecting services from a PSR-11-compatibile container in a Behat context.

Created with lots of help from @ciaranmcnulty.

Usage

First require the extension and dependencies with Composer:

$ composer require --dev roave/behat-psr11extension

First, if you don't already have one, create a file that will be included by the extension that returns a PSR-11 compatible container, for example using Laminas\ServiceManager:

<?php
declare(strict_types=1);

use Laminas\ServiceManager\Config;
use Laminas\ServiceManager\ServiceManager;

// Load configuration
$config = require __DIR__ . '/config.php';

// Build container
$container = new ServiceManager();
(new Config($config['dependencies']))->configureServiceManager($container);

// Inject config
$container->setService('config', $config);

return $container;

Then enable the extension in behat.yml:

  extensions:
    Roave\BehatPsrContainer\PsrContainerExtension:
      container: 'config/container.php'

Then enable the use of the psr_container service container (this is provided by the extension) in your behat.yml suite configuration, for example:

default:
  suites:
    my_suite:
      services: "@psr_container"

And finally, add the names of any services required by your contexts in behat.yml, for example:

default:
  suites:
    my_suite:
      services: "@psr_container"
      contexts:
        - MyBehatTestSuite\MyContext:
          - "@Whatever\\Service\\Name"

You can also use behat's built-in autowire feature, to automatically inject the dependencies to the context:

default:
  suites:
    my_suite:
      autowire: true
      services: "@psr_container"
      contexts:
        - MyBehatTestSuite\MyContext

If for some reason you want to use a name other than psr_container for the container (e.g. collision with another extension) this can be overridden:

  extensions:
    Roave\BehatPsrContainer\PsrContainerExtension:
      container: 'config/container.php'
      name: 'my_container'

Just for clarity (and hopefully ease of understanding), this would be the equivalent of doing this in plain PHP:

<?php
declare(strict_types=1);

$container = require 'config/container.php';

$context = new \MyBehatTestSuite\MyContext($container->get('Whatever\Service\Name'));