/BehatNoExtension

This Behat extension makes it possible to extend Behat without having to write an extension yourself.

Primary LanguagePHPMIT LicenseMIT

Behat No Extension

Scrutinizer Code Quality Build Status Build Status

This Behat extension makes it possible to extend Behat without having to write an extension yourself.

Installation

This extension requires:

  • Behat ^3.0
  • PHP ^7.1

The easiest way to install it is to use Composer

$ composer require --dev zalas/behat-no-extension

Next, activate the extension in your behat.yml:

# behat.yml
default:
  extensions:
    Zalas\Behat\NoExtension: ~

Importing service definitions

Extension enables you to load service definitions and parameters from configuration files specified in the imports section:

# behat.yml
default:
  extensions:
    Zalas\Behat\NoExtension:
      imports:
        - features/bootstrap/config/services.yml

These should simply be Symfony's service container configuration files:

# features/bootstrap/config/services.yml
services:
  Acme\SimpleArgumentResolver:
    tags:
      - { name: context.argument_resolver }

parameters:
  acme.foo: boo!

Yaml, xml and php formats are currently supported.

Note that any classes you'd like to use should be autoloaded by composer. For the example above, autoload-dev or autoload should include the Acme\\ autoloader prefix.

Injecting services into contexts

Enable the argument resolver to take advantage of the built in support for service injection:

# behat.yml
default:
  extensions:
    Zalas\Behat\NoExtension:
      argument_resolver: true
      imports:
        - features/bootstrap/config/services.yml

Assuming services you'd like to inject into contexts are defined in features/bootstrap/Acme, and they're autoloaded by composer, you can now start defining them in your configuration file:

# features/bootstrap/config/services.yml
services:

    Acme\:
        resource: '../Acme'
        public: true
        autowire: true

The above example relies on autoworing, but you could also define each service explicitly.

An example composer autoloader configuration:

{
    "autoload-dev": {
        "psr-4": {
            "Acme\\": "features/bootstrap/Acme"
        }
    }
}

Given there's a class Acme\Foo defined, it can now be injected into contexts:

use Acme\Foo;
use Behat\Behat\Context\Context;

class FeatureContext implements Context
{
    private $foo;

    public function __construct(Foo $foo)
    {
        $this->foo = $foo;
    }
}

Defining parameters

Parameters defined in imported files are also available in behat.yml:

# behat.yml
default:
  suites:
    search:
      contexts:
        - SearchContext:
            myFoo: '%acme.foo%'
  # ...

Furthermore, parameters can also be defined as part of extension's configuration directly in behat.yml:

# behat.yml
default:
  extensions:
    Zalas\Behat\NoExtension:
      parameters:
        foo: bar
        baz:
          a: 1
          b: 'bazinga!'

Contributing

Please read the Contributing guide to learn about contributing to this project. Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.