Мениджърът на обекти на Doctrine се срива и не работи

И така, когато провеждам тестове на моето ZF/Doctrine приложение, някои тестове прекъсват Doctrine Entity Manager и всички последователни тестове се провалят поради затварянето на EM.

Настроих EM в моите tests/bootstrap.php:

$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap();
(...)
$bootstrap = $application->getBootstrap();
$em = $bootstrap->getResource('doctrinemanager');

След това го задавам във функцията test setUp() ($this->_service е услугата, която се тества):

$em = App::getEntityManager();
$this->_em = clone $em;
$this->_service->setEm($this->_em);

И след това, когато стартирам тест, който кара EM да хвърли изключение и да затвори (и това е правилното поведение за мен), той остава затворен през всички тестове, които разбира се се провалят поради затварянето на EM. Това просто не е поведението, което очаквам за тестове, както можете да се досетите.

Опитах да клонирам EM преди да го настроя в услугата, но не се получи.

Има ли лесен начин за повторно отваряне на EM, може би чрез някои методи на Doctrine?


person kix    schedule 13.07.2011    source източник


Отговори (1)


Не, поне аз не знам. Най-лесният начин да заобиколите това би бил просто да (повторно) стартирате вашето приложение, за да се изпълнява във фазата на настройка на всеки тест. И така, всеки тест получава нов $application екземпляр и нов, нов $em заедно с него. Това е бързото решение.

Вероятно правилното решение е да отделите вашите тестове от вашия Zend_Application. Позволете на вашите тестове да се изпълняват с обикновен мениджър на обекти, евентуално с помощта на фиктивна връзка или връзка към база данни SQLite в паметта. Създайте само този мениджър на обекти във вашата фаза на настройка на теста, така че всеки тест да получава нов мениджър на обекти. Това е подобно на бързата корекция по-горе, с изключение на това, че сега създавате само специално мениджър на обекти за тестване, вместо да зареждате цялото си приложение за всеки тест. Това е по-икономично и по-просто.

person Sander Marechal    schedule 13.07.2011