Запуск модульного теста Symfony возвращает «Нет открытого соединения» - PullRequest
1 голос
/ 28 июля 2010

Кажется, у Symfony возникла проблема с открытием соединения с базой данных во время выполнения модульного теста. У меня есть мой тестовый env, указанный в config / database.yml:

all:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:host=localhost;dbname=ms'
      username: ms
      password: xxx
test:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:host=localhost;dbname=ms'
      username: ms
      password: xxx
...

и тестовый файл в (test / unit / MSTest.php) выглядит следующим образом:

require_once dirname(__FILE__).'/../bootstrap/unit.php';
$a = new Article();
$a->setHeadline("Article Headline");
$a->save();

Когда я пытаюсь запустить тест с использованием «symfony test: unit MS», он просто возвращает «Нет открытого соединения» и завершает работу. Запуск только теста (php test / unit / MSTest.php) возвращает полную трассировку стека:

C:\phpworkspace\ms>php test/unit/MSTest.php

Fatal error: Uncaught exception 'Doctrine_Connection_Exception' with message 'There is no open connection' in C:\phpworkspace\ms\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrine\Manager.php:662
Stack trace:
#0 C:\phpworkspace\ms\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrine\Manager.php(557): Doctrine_Manager->getCurrentConnection()
#1 C:\phpworkspace\ms\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrine\Core.php(1095): Doctrine_Manager->getConnectionForComponent('Article')
#2 C:\phpworkspace\ms\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrine\Record.php(219): Doctrine_Core::getTable('Article')
#3 C:\phpworkspace\ms\test\unit\UniversalDemoTest.php(15)
: Doctrine_Record->__construct()
#4 {main}
  thrown in C:\phpworkspace\ms\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrine\Manager.php on line 662

Я погуглил его и, похоже, все подсказки относятся к тесту database.yml: среде, которая (см. Выше) на месте. Я проверил это имя пользователя / пароль / имя базы данных в командной строке, и пользователь определенно допустим. Другое решение, описанное здесь , состоит в замене строки в unit.php с

$configuration = ProjectConfiguration::hasActive() ?
  ProjectConfiguration::getActive() :
  new ProjectConfiguration(realpath($_test_dir.'/..')); 

до

$configuration = ProjectConfiguration::getApplicationConfiguration(
  'frontend', 'test', true
); 

но в моем случае это тоже не помогает. Он загружает конфигурацию в обоих случаях, но в результате возвращает другой объект (print_r ($ configuration)) - ProjectConfiguration в случае значения по умолчанию и frontendConfiguration в случае недавно замененной строки; последний, кажется, имеет все правильные директивы конфигурации (app_xxx из файла app.xml). Пожалуйста, совет - где еще я могу посмотреть? Я очищал свой кеш (symfony cc), создавал отдельную базу данных для тестирования, перезагружал модели / приборы и пока ничего не работает. Модели действительны и уже используются повсеместно в приложении, поэтому это должно быть как-то связано с тестовой средой.

Я использую PHP 5.3.1, MySQL 5.1.41 с Symfony 1.4 (XAMPP).

Спасибо.

1 Ответ

6 голосов
/ 29 июля 2010

Вам нужно инициализировать менеджер баз данных, чтобы использовать классы моделей доктрины:

$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'test', true);
new sfDatabaseManager($configuration);
...