Как получить доступ к контейнеру Symfony 2 в рамках теста Unit? Мне нужны библиотеки, поэтому это очень важно.
Тестовые классы расширяют \PHPUnit_Framework_TestCase
поэтому нет контейнера.
Поддержка теперь встроена в Symfony. См. http://symfony.com/doc/master/cookbook/testing/doctrine.html.
Вот что вы могли бы сделать:
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(); } }
Для более современной и переработанной техники см. https://gist.github.com/jakzal/a24467c2e57d835dcb65 .
Обратите внимание, что использование контейнера в модульных тестах пахнет. Как правило, это означает, что ваши классы зависят от всего контейнера (весь мир), и это плохо. Вы должны ограничить свои зависимости и высмеять их.
Вы можете использовать это в своей настройке
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(); }
Не забудьте установить функцию слежения
protected function tearDown() { $this->em->close(); unset($this->client, $this->em,); }
Для различных конфигураций вы также используете пакет lastzero / test-tools .
Он настраивает контейнер для вас и готов к использованию:
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); } }