zalas/behat-no-extension

The ultimate Behat extension

v2.2.0 2019-12-15 09:16 UTC

This package is auto-updated.

Last update: 2021-10-15 13:00:57 UTC


README

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.