Skip to content

Commit

Permalink
bug #68 Better compatibility with Behat itself (pamil, alanpoulain)
Browse files Browse the repository at this point in the history
This PR was merged into the 2.0 branch.

Discussion
----------

Fixes #56.

If passed context identifier is a Symfony service, it's handled by our custom logic. If it's not, it's handled by default Behat logic.

Commits
-------

cd79270 Add support for class resolvers
9e9529c Add tests for context initializers
d74cd25 Add more sanity checks
c54c581 Refactor our environment handler to decorate the original one
8a972b5 Apply suggestions from code review
  • Loading branch information
pamil authored Feb 13, 2019
2 parents 0ac8f19 + 8a972b5 commit b20eacd
Show file tree
Hide file tree
Showing 13 changed files with 333 additions and 212 deletions.
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"behat/mink": "^1.7",
"behat/mink-browserkit-driver": "^1.3",
"behat/mink-extension": "^2.2",
"friends-of-behat/service-container-extension": "^1.0",
"phpstan/phpstan-shim": "^0.11",
"sylius-labs/coding-standard": "^3.0",
"symfony/framework-bundle": "^3.4|^4.1",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Feature: Mink integration with dependency injection
Feature: Mink integration

Background:
Given a working Symfony application with SymfonyExtension configured
Expand Down

This file was deleted.

65 changes: 65 additions & 0 deletions features/sanity_checks/class_resolvers_compatibility.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
Feature: Class resolvers compatibility

Scenario: Using class resolvers while handling context environment
Given a working Symfony application with SymfonyExtension configured
And a Behat configuration containing:
"""
default:
extensions:
FriendsOfBehat\ServiceContainerExtension:
imports:
- "tests/class_resolver.yml"
suites:
default:
contexts:
- class:resolved:context
"""
And a Behat services definition file "tests/class_resolver.yml" containing:
"""
services:
App\Tests\CustomClassResolver:
tags: ["context.class_resolver"]
"""
And a Behat service implementation file "tests/CustomClassResolver.php" containing:
"""
<?php
namespace App\Tests;
use Behat\Behat\Context\ContextClass\ClassResolver;
final class CustomClassResolver implements ClassResolver
{
public function supportsClass($contextClass): bool
{
return $contextClass === 'class:resolved:context';
}
public function resolveClass($contextClass): string
{
return 'App\Tests\SomeContext';
}
}
"""
And a feature file containing:
"""
Feature:
Scenario:
Then it should pass
"""
And a context file "tests/SomeContext.php" containing:
"""
<?php
namespace App\Tests;
use Behat\Behat\Context\Context;
final class SomeContext implements Context {
/** @Then it should pass */
public function itShouldPass(): void {}
}
"""
When I run Behat
Then it should pass
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
Feature: Context constructor dependency injection compatibility

Scenario: Using context constructor dependency injection
Given a working Symfony application with SymfonyExtension configured
And a Behat configuration containing:
"""
default:
suites:
default:
contexts:
- App\Tests\SomeContext:
- "@App\\Foo"
services:
App\Foo: ~
"""
And a class file "src/Foo.php" containing:
"""
<?php
namespace App;
final class Foo
{
}
"""
And a feature file containing:
"""
Feature:
Scenario:
Then it should pass
"""
And a context file "tests/SomeContext.php" containing:
"""
<?php
namespace App\Tests;
use App\Foo;
use Behat\Behat\Context\Context;
final class SomeContext implements Context {
public function __construct(Foo $foo)
{
$this->foo = $foo;
}
/** @Then it should pass */
public function itShouldPass(): void
{
assert($this->foo instanceof Foo);
}
}
"""
When I run Behat
Then it should pass
71 changes: 71 additions & 0 deletions features/sanity_checks/context_initializer_compatibility.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
Feature: Context initializer compatibility

Scenario: Using class resolvers while handling context environment
Given a working Symfony application with SymfonyExtension configured
And a Behat configuration containing:
"""
default:
extensions:
FriendsOfBehat\ServiceContainerExtension:
imports:
- "tests/context_initializer.yml"
suites:
default:
contexts:
- App\Tests\SomeContext
"""
And a Behat services definition file "tests/context_initializer.yml" containing:
"""
services:
App\Tests\CustomContextInitializer:
tags: ["context.initializer"]
"""
And a Behat service implementation file "tests/CustomContextInitializer.php" containing:
"""
<?php
namespace App\Tests;
use Behat\Behat\Context\Context;
use Behat\Behat\Context\Initializer\ContextInitializer;
final class CustomContextInitializer implements ContextInitializer
{
public function initializeContext(Context $context): void
{
$context->makeItPass(true);
}
}
"""
And a feature file containing:
"""
Feature:
Scenario:
Then it should pass
"""
And a context file "tests/SomeContext.php" containing:
"""
<?php
namespace App\Tests;
use Behat\Behat\Context\Context;
final class SomeContext implements Context {
private $shouldPass = false;
public function makeItPass(bool $shouldPass)
{
$this->shouldPass = $shouldPass;
}
/** @Then it should pass */
public function itShouldPass(): void
{
assert($this->shouldPass === true);
}
}
"""
When I run Behat
Then it should pass
2 changes: 1 addition & 1 deletion phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ parameters:
- '/Cannot access offset 0 on callable/'
- '/Cannot access offset 1 on callable/'
- '/Cannot call method [a-zA-Z0-9]+\(\) on Symfony\\Component\\Config\\Definition\\Builder\\NodeParentInterface|null\./'
- '/Method FriendsOfBehat\\SymfonyExtension\\Context\\Environment\\InitialisedContextServiceEnvironment::bindCallee\(\) should return callable/'
- '/Method FriendsOfBehat\\SymfonyExtension\\Context\\Environment\\InitializedSymfonyExtensionEnvironment::bindCallee\(\) should return callable/'
- '/Strict comparison using === between 0\|1 and 2 will always evaluate to false\./'
Loading

0 comments on commit b20eacd

Please sign in to comment.