Слишком много подключений во время модульного тестирования

У меня есть проект с большим количеством тестов, таких как

class MyTest extends BaseTestCase
{
    public function __construct() 
    {
        parent::__construct();
        $this->em = $this->get('doctrine')->getManager();
    }
    public function setUp() {

        $this->init();

        //load sql data for the tests
        $path = $this->get('kernel')->locateResource('@Bundle/Data/Test.sql');
        $content_file_sql_data = file_get_contents($path);
        $stmt = $this->em->getConnection()->prepare($content_file_sql_data);
        $stmt->execute();
        $stmt->closeCursor();
    }
        /*
         *   Then we do a lot of tests using the database
         */
}

Все они расширяют мой BaseTestCase:

abstract class BaseTestCase extends \PHPUnit_Framework_TestCase {

protected $_container;
protected $kernel;

public function __construct() {

  parent::__construct();
  $this->kernel = new \AppKernel("test", true);
  $this->kernel->boot();
  $this->_container = $this->kernel->getContainer();

  $this->init();
}

//empty the database before each test class
public function init() {

  $this->_application = new Application($this->kernel);
  $this->_application->setAutoExit(false);
  //rebuild and empty the database
  $this->runConsole("doctrine:schema:drop", array("--force" => true));
  $this->runConsole("doctrine:schema:create");

}

Так как у меня много тестов, я недавно получил несколько ошибок PDOException: SQLSTATE[08004] [1040] Too many connections. Это похоже на то, что phpunit никогда не закрывает соединение с базой данных, и около 100 тестов я получаю эту ошибку для всех других тестов.

Как я могу это исправить?

Я попытался поставить последний тест, выполняющий $this->em->close() в конце каждого тестового класса, но это не решило его.

Некоторая дополнительная информация: я почти уверен, что у меня нет проблем с ОДНИМ тестом, потому что, если я изменю порядок набора тестов, ошибка появится примерно на том же количестве пройденных классов тестов.


person goto    schedule 17.01.2014    source источник
comment
У меня была аналогичная проблема stackoverflow.com/questions/24657671/ Может быть, вы нашли какое-либо решение?   -  person zIs    schedule 18.07.2014


Ответы (1)


Мое решение состояло в том, чтобы переопределить метод shutdown в моем классе Bundle:

public function shutdown()
{
    if ('test' == $this->container->getParameter('kernel.environment')) {
        /* @var EntityManager $em */
        $em = $this->container->get('doctrine.orm.default_entity_manager');
        $em->getConnection()->close();
    }
}
person munkie    schedule 10.06.2014