web-dev-qa-db-fra.com

Accéder au conteneur Symfony 2 via le test unitaire?

Comment accéder au conteneur Symfony 2 dans un test unitaire? Mes bibliothèques en ont besoin, donc c'est essentiel.

Les classes de test étendent \PHPUnit_Framework_TestCase donc il n'y a pas de conteneur.

40
Tower

Le support est maintenant intégré à Symfony. Voir http://symfony.com/doc/master/cookbook/testing/doctrine.html

Voici ce que vous pourriez faire:

namespace AppBundle\Tests;

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

class MyDatabaseTest extends KernelTestCase
{
    private $container;

    public function setUp()
    {
        self::bootKernel();

        $this->container = self::$kernel->getContainer();
    }
}

Pour une technique plus moderne et réutilisable, voir https://Gist.github.com/jakzal/a24467c2e57d835dcb65 .

Notez que l’utilisation du conteneur dans les tests unitaires dégage une odeur. En règle générale, cela signifie que vos classes dépendent du conteneur entier (monde entier) et que cela n’est pas bon. Vous devriez plutôt limiter vos dépendances et vous en moquer.

90
Jakub Zalas

Vous pouvez l'utiliser dans votre fonction de configuration

protected $client;
protected $em;

/**
 * PHP UNIT SETUP FOR MEMORY USAGE
 * @SuppressWarnings(PHPMD.UnusedLocalVariable) crawler set instance for test.
 */
public function setUp()
{
    $this->client = static::createClient(array(
            'environment' => 'test',
    ),
        array(
            'HTTP_Host' => 'Host.tst',
            'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0',
    ));

    static::$kernel = static::createKernel();
    static::$kernel->boot();
    $this->em = static::$kernel->getContainer()
                               ->get('doctrine')
                               ->getManager();
    $crawler = $this->client->followRedirects();
}

N'oubliez pas de définir votre fonction de démontage 

    protected function tearDown()
{
    $this->em->close();
    unset($this->client, $this->em,);
}
12
Babou34090

Mise à jour 2018: Depuis Symfony 3.4/4.0, le test de service pose problème.

C'est ce qu'on appelle "tester les services privés", les solutions possibles sont décrites ici


Pour différentes configurations, vous utilisez également lastzero/test-tools package.

Il met en place un conteneur pour vous et est prêt à être utilisé:

use TestTools\TestCase\UnitTestCase;

class FooTest extends UnitTestCase
{
    protected $foo;

    public function setUp()
    {
        $this->foo = $this->get('foo');
    }

    public function testBar()
    {
        $result = $this->foo->bar('Pi', 2);
        $this->assertEquals(3.14, $result);
    }
}
1
Tomáš Votruba