Tests unitaires dans Symfony avec PHPUnit et un bundle "standalone"
Salut à tous,
Je suis en train d'étudier comment mettre en place des tests unitaires dans un bundle. Après avoir compulsé pas mal de pages web sur le sujet, je reste cependant bloqué.
Voici dans un premier temps ce que je veux tester :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
<?php
// vendor/acme/DemoBundle/AcmeDemoBundleTest.php
namespace Acme\DemoBundle\Tests;
use Acme\DemoBundle\AcemDemoBundle;
class AcmeDemoBundleTest extends ContainerAwareTestCase
{
public function testBuild()
{
$bundle = new AcmeDemoBundle();
$bundle->build($this->container);
[...]
}
} |
Voici mon ContainerAwareTestCase dans le dossier Tests/ :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
<?php
// vendor/acme/DemoBundle/Tests/ContainerAwareTestCase.php
namespace Acme\DemoBundle\Tests;
use Symfony\Bundle\FrameworkBundle\Tests\TestCase
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
abstract class ContainerAwareTestCase extends TestCase
{
/**
* @var Kernel
*/
protected $kernel;
/**
* @var ContainerBuilder
*/
protected $container;
/**
* {@inheritDoc}
* @see PHPUnit_Framework_TestCase::setUp()
*/
protected function setUp()
{
parent::setUp();
$this->kernel = new \AppKernel('test', true);
$this->kernel->boot();
$this->container = $this->kernel->getContainer();
}
/**
* {@inheritDoc}
* @see PHPUnit_Framework_TestCase::tearDown()
*/
protected function tearDown()
{
if ( null !== $this->kernel ) {
$this->kernel->shutdown();
}
parent::tearDown();
}
} |
J'ai créé un noyau indépendant Symfony comme suite (je me suis inspiré en autre de http://gnugat.github.io/2014/10/29/s...tandalone.html) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
<?php
// vendor/acme/DemoBundle/Tests/autoload.php
$file = __DIR__ . '/../vendor/autoload.php';
if ( !file_exists($file) ) {
$file = __DIR__ . '/../../../../vendor/autoload.php';
if ( !file_exists($file) ) {
throw new \Exception('Run composer install command in your bundle to run test suite.');
}
}
$loader = require_once $file;
require_once __DIR__ . '/Fixtures/app/AppKernel.php'; |
et
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
<?php
// vendor/acme/DemoBundle/Tests/Fixtures/AppKernel.php
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;
class AppKernel extends Kernel
{
public function registerBundles()
{
$bundles = array(
new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
new Acme\DemoBundle\AcmeDemoBundle()
);
return $bundles;
}
public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
}
} |
Pour finir je précise à phpunit d'utiliser ce kernel :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
// vendor/acme/DemoBundle/phpunit.dist
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
bootstrap="./Tests/autoload.php">
<testsuites>
<testsuite name="Acme Demo Test Suite">
<directory>./Tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory>./</directory>
<exclude>
<directory>./Resources</directory>
<directory>./Tests</directory>
<directory>./vendor</directory>
</exclude>
</whitelist>
</filter>
</phpunit> |
Lorsque je lance phpunit, j'ai le message d'erreur suivant :
Code:
1 2
|
Argument 1 passed to Symfony\Component\HttpKernel\Bundle\Bundle::build() must be an instance of Symfony\Component\DependencyInjection\ContainerBuilder, instance of appTestDebugProjectContainer given, ... |
Ce qui est normal au vue de ce (très bon article d'ailleurs) : https://knpuniversity.com/screencast...-the-container. Pour ceux qui veulent en savoir plus sur le mécanisme des Dependencies Injection.
Du coup, est-ce que quelqu'un a déjà fait cela et me dire si je m'y prend bien ou pas ?
Merci d'avance