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');
}

}


Вопросы)

  1. Кто-нибудь знает, почему тип DBAL не остается незарегистрированным, когда пачка выключается?
  2. Мое решение безопасно? Это единственное решение или вы знаете других?

0 ответов

Другие вопросы по тегам