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.
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.
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,);
}
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);
}
}