PHPUnit / Zend_Test: PDOException: вы не можете сериализовать или десериализовать экземпляры PDO - PullRequest
1 голос
/ 17 декабря 2010

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

PDOException: You cannot serialize or unserialize PDO instances

когда я пытаюсь использовать PHPUnit для модульных тестов. У меня мало что происходит. Я использую Zend Framework 1.11. Наверное, может быть, у меня Bootstrapped мое приложение, хранящее менеджер сущностей в 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.php выглядит как http://pastebin.com/hVZhJAG1

UPDATE

Я обнаружил, что проблема начинается, когда у меня есть строка

$schemaTool->dropSchema($classes);
$schemaTool->updateSchema($classes);

в bootstrap.php http://pastebin.com/hVZhJAG1

Ответы [ 3 ]

3 голосов
/ 20 декабря 2010

PHPUnit создает резервные копии глобалов. Если PDO находится где-то в $ GLOBALS или внутри объекта, который находится в $ GLOBALS, вы получаете эту проблему.

2 голосов
/ 04 августа 2013

Я обнаружил эту проблему раньше, после поиска в Интернете я получил одно решение из http://www.phpunit.de/ticket/376. Просто установите backupGlobals в false на 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);
0 голосов
/ 25 декабря 2010

Это было когда-то, но я думаю, что я исправил проблему, удалив использование Zend_Registry из bootstrap.php

http://pastebin.com/BS79xviM

...