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 :
Voici mon ContainerAwareTestCase dans le dossier Tests/ :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); [...] } }
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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(); } }
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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';
Pour finir je précise à phpunit d'utiliser ce kernel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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'); } }
Lorsque je lance phpunit, j'ai le message d'erreur suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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>
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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, ...
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
Partager