PHPUnit / Zend_Test:PDOException:您无法序列化或反序列化PDO实例

时间:2010-12-17 15:09:41

标签: zend-framework phpunit doctrine-orm zend-test

我收到了异常

  

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

更新

我发现问题在我有行

时开始
$schemaTool->dropSchema($classes);
$schemaTool->updateSchema($classes);

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

3 个答案:

答案 0 :(得分:3)

PHPUnit备份全局变量。如果PDO位于$ GLOBALS中的某个位置或位于$ GLOBALS中的对象内,则会出现此问题。

答案 1 :(得分:2)

之前我发现了这个问题,在搜索网页后,我从http://www.phpunit.de/ticket/376获得了一个解决方案。只需在PHPUnit / Frameword / TestCase.php中的backupGlobalsprotected $backupGlobals = TRUE;设置为false。

但PHPUnit开发团队并不主张:PHPUnit的大多数用户希望它能够像启用$ GLOBALS功能的备份时那样工作。这就是默认启用它的原因。

如果您的测试执行将不可序列化的对象放入$ GLOBALS的代码,则可以禁用该功能。从软件设计的角度来看,您不应该首先拥有PDO的全局实例。

所以,我用这个得到了完美的解决方案:

$db = SmartPHP_Db::factory($dbConfig);
SmartPHP_Pool::set("db" , $db);
SmartPHP_Db_Table::setDefaultAdapter($db);

单元测试代码后:

unset($db);

答案 2 :(得分:-1)

已经过了一段时间,但我认为我通过从Zend_Registry取消使用bootstrap.php来解决问题

http://pastebin.com/BS79xviM