我有例外

PDOException: You cannot serialize or unserialize PDO instances

当我试图使用Phpunit进行单位测试时。我没有太多。我正在使用Zend Framework 1.11。我想也许我已经在Zend_Registry中存储了Entity Manager的应用程序?

// 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

已经有一段时间了,但我认为我通过删除使用的使用解决了问题 Zend_Registrybootstrap.php

http://pastebin.com/bs79xvim

其他提示

phpunit备份全球范围。如果PDO在$ GLOBALS中或$ Globals中的对象中,您会遇到此问题。

我之前发现了这个问题,在搜索网络后,我从中得到了一个解决方案 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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top