zalas / behat-no-extension
The ultimate Behat extension
Installs: 134 089
Dependents: 1
Suggesters: 0
Security: 0
Stars: 31
Watchers: 4
Forks: 3
Open Issues: 0
Requires
- php: ^7.2
- behat/behat: ^3.0
- symfony/dependency-injection: ^3.4||^4.4||^5.0
Requires (Dev)
- bossa/phpspec2-expect: ^3.0
- phpspec/phpspec: ^6.1
- sebastian/comparator: ^2.0||^3.0
- symfony/filesystem: ^3.4||^4.4||^5.0
- symfony/process: ^3.4||^4.4||^5.0
README
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.