PHPUnit / Zend_Test: PDOException: non è possibile serializzare o unserialize casi DOP
-
11-10-2019 - |
Domanda
io sono sempre l'eccezione
PDOException: You cannot serialize or unserialize PDO instances
quando sto provando ad usare PHPUnit per i test unitari. Non ho molto in corso. Sto usando Zend Framework 1.11. Credo che forse che ho bootstrap mia domanda memorizzare il gestore di entità in Zend_Registry?
// application/Bootstrap.php -> _initDoctrine()
$em = EntityManager::create($doctrineOptions['connectionOptions'], $config);
Zend_Registry::set("em", $em);
Per il mio test di unità, sembra che
class Application_Models_UserTest extends Zend_Test_PHPUnit_ControllerTestCase
public function testUnitTest() {
$this->assertTrue(true);
}
}
I miei sguardi phpunit.xml come http://pastebin.com/BCv2Ci8R , penso che la principale area di preoccupazione è la linea 1, Così sembra bootstrap.php come http://pastebin.com/hVZhJAG1
Aggiorna
Ho trovato che il problema inizia quando ho la riga
$schemaTool->dropSchema($classes);
$schemaTool->updateSchema($classes);
Soluzione 3
Il suo stato qualche volta, ma penso di aver risolto il problema rimuovendo l'utilizzo di Zend_Registry
da bootstrap.php
Altri suggerimenti
PHPUnit backup globali. Se DOP è da qualche parte nel $ GLOBALS o all'interno di un oggetto che si trova in $ GLOBALS si ottiene questo problema.
Ho trovato questo problema prima, dopo la ricerca sul web ho avuto una soluzione da http: //www.phpunit .de / biglietti / 376 . Basta impostare backupGlobals
false a protected $backupGlobals = TRUE;
in PHPUnit / Frameword / TestCase.php.
Ma la squadra PHPUnit sviluppatore non sosteniamo che: la maggior parte degli utenti di PHPUnit si aspetta che il lavoro come avviene quando il backup di $ GLOBALS funzione è abilitata. Questo è il motivo per cui è abilitato di default.
Se i test da sforzo codice che mette gli oggetti in unserializable $ GLOBALS è possibile disattivare la funzione. Dal punto di vista software di progettazione, non si dovrebbe avere un'istanza globale della DOP per cominciare.
Così, ho ottenuto la soluzione perfetta con questo:
$db = SmartPHP_Db::factory($dbConfig);
SmartPHP_Pool::set("db" , $db);
SmartPHP_Db_Table::setDefaultAdapter($db);
dopo il codice di test di unità:
unset($db);