PhpUnit/Zend_Test: PdoException: Вы не можете сериализовать или не раскрыть экземпляры PDO

StackOverflow https://stackoverflow.com/questions/4471802

Вопрос

Я получаю исключение

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

http://pastebin.com/bs79xvim

Другие советы

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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top