PhpUnit/Zend_Test: PdoException: Вы не можете сериализовать или не раскрыть экземпляры PDO
-
11-10-2019 - |
Вопрос
Я получаю исключение
PDOException: You cannot serialize or unserialize PDO instances
Когда я пытаюсь использовать Phpunit для модульных тестов. У меня мало что происходит. Я использую Zend Framework 1.11. Я думаю, что, может быть, я загрузил свою приложение, сохранив менеджер объектов в Zend_registry?
// application/Bootstrap.php -> _initDoctrine()
$em = EntityManager::create($doctrineOptions['connectionOptions'], $config);
Zend_Registry::set("em", $em);
Для моего модульного теста это похоже на
class Application_Models_UserTest extends Zend_Test_PHPUnit_ControllerTestCase
public function testUnitTest() {
$this->assertTrue(true);
}
}
Мой phpunit.xml выглядит как http://pastebin.com/bcv2ci8r, Я думаю, основная проблема, связанная с линией 1, так что Bootstrap. http://pastebin.com/hvzhjag1
ОБНОВИТЬ
Я обнаружил, что проблема начинается, когда у меня есть линия
$schemaTool->dropSchema($classes);
$schemaTool->updateSchema($classes);
в Bootstrap.php http://pastebin.com/hvzhjag1
Решение 3
Это было когда -нибудь, но я думаю, что исправил проблему, сняв использование Zend_Registry
из bootstrap.php
Другие советы
Phpunit Backags Globals. Если PDO находится где -то в $ Globals или внутри объекта, который находится в $ Globals, вы получаете эту проблему.
Я нашел эту проблему раньше, после поиска в Интернете, у меня было одно решение http://www.phpunit.de/ticket/376. Анкет Просто настроен backupGlobals
ложно в protected $backupGlobals = TRUE;
в phpunit/frameword/testcase.php.
Но команда разработчиков Phpunit не защищает это: большинство пользователей Phpunit ожидают, что он будет работать так же, как и в случае резервного копирования функции $ Globals. Вот почему он включен по умолчанию.
Если ваши тесты кода упражнения, который ставит неразрешимые объекты в $ Globals, вы можете отключить эту функцию. С точки зрения разработки программного обеспечения, у вас не должно быть глобального экземпляра PDO для начала.
Итак, я получил идеальное решение, используя это:
$db = SmartPHP_Db::factory($dbConfig);
SmartPHP_Pool::set("db" , $db);
SmartPHP_Db_Table::setDefaultAdapter($db);
После модульного кода тестирования:
unset($db);