【问题标题】:PHPUnit/Zend_Test: PDOException: You cannot serialize or unserialize PDO instancesPHPUnit/Zend_Test: PDOException: 你不能序列化或反序列化 PDO 实例
【发布时间】:2011-05-27 04:29:58
【问题描述】:

我遇到了异常

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    http://pastebin.com/BS79xviM

    【讨论】:

    • 如果使用 Zend_Registry 是您的主要应用程序,这不是一个有用的答案;你会遇到同样的错误。
    【解决方案3】:

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

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

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

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

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

    单元测试代码后:

    unset($db);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-31
      • 2017-09-10
      • 1970-01-01
      • 2019-06-25
      • 2012-06-11
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      相关资源
      最近更新 更多