friends-of-behat/symfony-extension
Installation Add the package via Composer:
composer require --dev friends-of-behat/symfony-extension
Ensure behat/behat and symfony/browser-kit are also installed.
Configure behat.yml
Add the extension to your Behat config:
default:
extensions:
FriendsOfBehat\SymfonyExtension:
kernel:
class: App\Kernel
env: test
First Use Case: Testing a Controller
Define a context as a Symfony service (e.g., FeatureContext):
// src/FeatureContext.php
namespace App\Tests\Feature;
use Symfony\Component\HttpKernel\KernelInterface;
use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContextInterface;
class FeatureContext implements Context, SnippetAcceptingContextInterface
{
public function __construct(private KernelInterface $kernel) {}
/**
* @Given I access the homepage
*/
public function iAccessTheHomepage(): void
{
$client = $this->kernel->getContainer()->get('test.client');
$client->request('GET', '/');
}
}
Run Behat:
./vendor/bin/behat
config/services.yaml:
services:
App\Tests\Feature\FeatureContext:
tags: ['behat.context']
EntityManager, Router):
use Doctrine\ORM\EntityManagerInterface;
class FeatureContext {
public function __construct(private EntityManagerInterface $em) {}
}
behat.yml:
FriendsOfBehat\SymfonyExtension:
mink:
base_url: 'http://localhost'
sessions:
default:
symfony: ~
use Behat\MinkExtension\Context\MinkContext;
class FeatureContext extends MinkContext {
/**
* @Given I am on the homepage
*/
public function iAmOnTheHomepage(): void
{
$this->visitPath('/');
}
}
FriendsOfBehat\SymfonyExtension:
kernel:
env: test # or 'dev', 'prod'
$container = $this->kernel->getContainer();
$container->set('some.service', $mockService);
# behat.yml
suites:
default:
contexts:
- App\Tests\Feature\FeatureContext:
tags: ['@smoke', '@api']
./vendor/bin/behat --tags "@smoke"
Kernel Initialization Issues
env: test is set to avoid conflicts with production/secrets.$this->kernel->boot();
if services fail to load.Mink Session Configuration
BrowserKit driver, ensure FriendsOfBehat\SymfonyExtension is loaded after Behat\MinkExtension in behat.yml.symfony and goutte sessions in the same suite.Circular Dependencies
Database Transactions
behat.yml to roll back changes:
FriendsOfBehat\SymfonyExtension:
kernel:
env: test
debug: true
transactional: true
Enable Debug Mode
FriendsOfBehat\SymfonyExtension:
kernel:
debug: true
This dumps kernel events and errors to the console.
Inspect the Kernel Container Use a custom context to debug services:
public function dumpContainer(): void
{
$container = $this->kernel->getContainer();
dump($container->getServiceIds());
}
Log Behat Events Add a listener to log context initialization:
use Behat\Behat\Event\SuiteEvent;
use Behat\Behat\Event\SuiteEvents;
$eventDispatcher->addListener(SuiteEvents::BEFORE_SUITE, function (SuiteEvent $event) {
\Behat\Testwork\Output\ConsoleOutput::getInstance()->writeln('Suite started!');
});
Custom Kernel Factories Override kernel creation for complex setups:
use FriendsOfBehat\SymfonyExtension\Kernel\KernelFactoryInterface;
class CustomKernelFactory implements KernelFactoryInterface
{
public function createKernel(array $config): KernelInterface
{
return new CustomKernel($config['env'], $config['debug']);
}
}
Register it in behat.yml:
FriendsOfBehat\SymfonyExtension:
kernel_factory: App\Tests\CustomKernelFactory
Event Subscribers
Hook into Symfony events (e.g., KernelEvents::REQUEST) from contexts:
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
$dispatcher = $this->kernel->getContainer()->get('event_dispatcher');
$dispatcher->addListener(KernelEvents::REQUEST, function (RequestEvent $event) {
// Modify request/response
});
Dynamic Configuration Load Behat config from Symfony parameters:
# config/packages/behat.yaml
behat:
suites:
default:
paths: ['%kernel.project_dir%/tests/Feature']
Access via:
$projectDir = $this->kernel->getProjectDir();
How can I help you explore Laravel packages today?