2010-07-28 1 views
1

У Symfony, похоже, проблема с открытием соединения с базой данных при запуске модульного теста. Я мой тест окр указан в конфигурации/databases.yml:Запуск теста модуля Symfony возвращает «Нет открытого соединения»

 
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 
... 

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

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

Когда я пытаюсь запустить тест с использованием «теста Symfony: единица MS» он просто возвращает «Нет открытого соединения» и выходит. Запуск теста в одиночку (тест PHP/блок/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 теста: окружающей среды, которые (смотри выше) на месте. Я тестировал имя имени пользователя/пароля/db в командной строке, и пользователь является действительным. other solution described here должен заменить строку в 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).

Спасибо.

ответ

6

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

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

Вот оно! добавление «нового sfDatabaseManager ($ configuration)»; после измененной линии сделал трюк, спасибо большое! – dsomnus

 Смежные вопросы

  • Нет связанных вопросов^_^