Symfony container for easy service mocking
MIT License
This container enables you to mock services in the Symfony dependency injection container. It is particularly useful in functional tests.
Add SymfonyContainerMocks using composer:
composer require "ramunasd/symfony-container-mocks"
or edit your composer.json:
{
"require": {
"ramunasd/symfony-container-mocks": "*"
}
}
Replace base container class for test environment in app/AppKernel.php
<?php
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;
use RDV\SymfonyContainerMocks\DependencyInjection\TestKernelTrait;
class AppKernel extends Kernel
{
// use special container when env=test
use TestKernelTrait;
public function registerBundles()
{
return [
// bundles
];
}
public function registerContainerConfiguration(LoaderInterface $loader)
{
}
}
And clear application cache.
<?php
namespace Acme\Bundle\AcmeBundle\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Acme\Bundle\AcmeBundle\Service\Custom;
class AcmeControllerTest extends WebTestCase
{
/**
* @var \Symfony\Bundle\FrameworkBundle\Client $client
*/
private $client;
public function setUp()
{
parent::setUp();
$this->client = static::createClient();
}
public function tearDown()
{
$this->client->getContainer()->tearDown();
$this->client = null;
parent::tearDown();
}
public function testSomethingWithMockedService()
{
$this->client->getContainer()->prophesize('acme.service.custom', Custom::class)
->someMethod([])
->willReturn(false)
->shouldBeCalledTimes(2);
// ...
}
}
feature works only with flag "debug" enabled.
$mock = $this->client->getContainer()->prophesize('acme.service.custom');
$mock
->myMethod()
->willReturn(true);
// create stub
$mock = $this->getMock(Custom::class);
// inject service mock
self::$kernel->getContainer()->setMock('acme.service.custom', $mock);
// reset container state
self::$kernel->getContainer()->unMock('acme.service.custom');
// set custom value during test
self::$kernel->getContainer()->setMockedParameter('acme.service.parameter1', 'customValue1');
// trigger service, assert results
// reset all parameters to original values
self::$kernel->getContainer()->clearMockedParameters();