2011-07-13 16 views
6

Così, quando eseguo i test sull'applicazione ZF/Doctrine, alcuni test si verificano per interrompere Doctrine Entity Manager e tutti i test sequenziali falliscono a causa della chiusura di EM.Gestore entità di Doctrine si blocca e rimane inattivo

ho impostato la EM nel mio test/bootstrap.php:

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

Poi ho impostato all'interno della configurazione di prova() function ($ this -> _ servizio è il servizio in fase di test):

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

E poi quando eseguo un test che causa EM per lanciare un'eccezione e chiudere (e questo è il comportamento corretto per me), rimane chiuso durante tutti i test che, naturalmente, falliscono a causa della chiusura di EM. Questo non è il comportamento che mi aspetto dai test, come puoi immaginare.

ho provato la clonazione del EM prima di impostare nel servizio, ma non ha funzionato.

C'è un modo semplice per riaprire il EM magari usando alcuni metodi dottrina?

risposta

6

No, non che io sappia comunque. Il modo più semplice per farlo sarebbe semplicemente (re) riavviare l'applicazione per l'esecuzione nella fase di configurazione di ogni test. Quindi, ogni test riceve una nuova istanza $application e un nuovo $em insieme a esso. Questa è la soluzione rapida.

La soluzione corretta è probabilmente quella di disaccoppiare i test dal tuo Zend_Application. Consentire ai test di essere eseguiti con un semplice gestore di entità, possibilmente utilizzando una connessione fittizia o una connessione a un in-memory SQLite database. Crea solo questo gestore di entità nella fase di impostazione del test, quindi ogni test ottiene un nuovo gestore di entità. Questo è simile alla soluzione rapida di cui sopra, tranne che ora si crea solo un gestore di entità per test invece di eseguire il bootstrap dell'intera applicazione per ogni test. È più snello e semplice.

Problemi correlati