1

我得到了例外

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.php 看起来像http://pastebin.com/hVZhJAG1

更新

我发现当我有线路时问题就开始了

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

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

4

3 回答 3

3

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

于 2010-12-19T21:34:12.537 回答
2

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

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

如果您的测试练习将不可序列化对象放入 $GLOBALS 的代码,您可以禁用该功能。从软件设计的角度来看,您不应该从一个全局的 PDO 实例开始。

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

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

单元测试代码后:

unset($db);
于 2013-08-04T11:49:22.263 回答
-1

已经有一段时间了,但我想我通过删除Zend_Registryfrom的使用解决了这个问题bootstrap.php

http://pastebin.com/BS79xviM

于 2010-12-25T08:19:19.360 回答