PHPUnit и пользовательские типы
Вот как мой основной файл пакета
<?php
namespace Foo\FooBundle;
use Doctrine\DBAL\Types\Type;
use Symfony\Component\HttpKernel\Bundle\Bundle;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class FooBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
parent::build($container);
}
public function boot()
{
$em = $this->container->get('doctrine.orm.entity_manager');
Type::addType('custom_date', 'Foo\FooBundle\Doctrine\DBAL\Types\CustomDate');
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('custom_date','custom_date');
}
}
Так что, как вы могли бы ночью, у меня есть пользовательский тип, который я зарегистрировал во время boot()
работа моей связки.
Теперь во время моих тестов я столкнулся с некоторыми проблемами. Некоторый тест должен использовать статические функции setUpBeforeClass()
а также tearDownAfterClass()
потому что мне нужно EntityManager
а также Container
, Ниже моих функций (общение с более чем одним тестовым классом)
public static function setUpBeforeClass()
{
static::$kernel = static::createKernel();
static::$kernel->boot();
self::$em = static::$kernel->getContainer()
->get('doctrine')
->getManager()
;
}
public static function tearDownAfterClass()
{
parent::tearDown();
self::$em->close();
}
Теперь, если я запускаю более одного тестового класса, который использует static::$kernel->boot();
некоторые тесты не пройдены из-за исключений DBAL, утверждающих, что custom_date
тип уже зарегистрирован.
Это довольно странно для меня, как parent::tearDown();
функция
/**
* Shuts the kernel down if it was used in the test.
*/
protected function tearDown()
{
if (null !== static::$kernel) {
static::$kernel->shutdown();
}
}
а также static::$kernel->shutdown();
является
public function shutdown()
{
if (false === $this->booted) {
return;
}
$this->booted = false;
foreach ($this->getBundles() as $bundle) {
$bundle->shutdown();
$bundle->setContainer(null);
}
$this->container = null;
}
Таким образом, для меня, если пакет выключен, теоретически, даже его пользовательские типы должны быть незарегистрированными. Кажется, что нет.
Мое решение
Я модифицировал boot()
функция для проверки, если тип уже зарегистрирован
public function boot()
{
if (false === Type::hasType('custom_date')) {
$em = $this->container->get('doctrine.orm.entity_manager');
Type::addType('custom_date', 'Foo\FooBundle\Doctrine\DBAL\Types\CustomDate');
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('custom_date','custom_date');
}
}
Вопросы)
- Кто-нибудь знает, почему тип DBAL не остается незарегистрированным, когда пачка выключается?
- Мое решение безопасно? Это единственное решение или вы знаете других?