PHPUnit和自定义类型

时间:2015-02-11 15:33:31

标签: symfony doctrine-orm dbal

这是我的捆绑主文件

的方式
<?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(),因为我需要EntityManagerContainer。在我的函数下面(公共到多个测试类)

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

所以,对我来说,如果bundle被关闭,那么即使他的自定义类型也应该是未注册的。看来他们没有。

<小时/>

我的解决方案

我修改了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');
}

}


问题(S)

  1. 有人知道为什么在关闭捆绑包时未注册DBAL类型?
  2. 我的解决方案安全吗?是唯一的解决方案还是你认识别人?

0 个答案:

没有答案