phpunit不能序列化或取消序列化PDO实例

phpunit不能序列化或取消序列化PDO实例,phpunit,Phpunit,我将PHPUnit与processIsolation=“true”一起使用,因为我需要在测试的代码中设置cookie值,而没有processIsolation=“true”就无法完成。但在我的一个测试用例中,我得到了一个错误: PHPUnit_Framework_Exception: [10-May-2018 15:23:28 UTC] PHP Fatal error: Uncaught PDOException: You cannot serialize or unserialize PDO

我将PHPUnit与processIsolation=“true”一起使用,因为我需要在测试的代码中设置cookie值,而没有processIsolation=“true”就无法完成。但在我的一个测试用例中,我得到了一个错误:

PHPUnit_Framework_Exception: [10-May-2018 15:23:28 UTC] PHP Fatal error:  Uncaught PDOException: You cannot serialize or unserialize PDO instances in -:394
Stack trace:
#0 [internal function]: PDO->__sleep()
#1 -(394): serialize(Array)
#2 -(536): __phpunit_run_isolated_test()
#3 {main}
  thrown in - on line 394
测试用例:

public function testUserCookieIsSavedToClicksTable()
{
    $cookie = sha1('12345');
    $_COOKIE['user_cookie'] = $cookie;
    $offerId = 1;
    $tx = $this->getTx($offerId);

    // Go
    $this->controller = new ClickController(new Click(new Database(Cache::getInstance()), new Queue, new RedisStorage()));
    $this->runLocal([1, $this->userId], null);

    $sql = 'select * from clicks order by id desc limit 1';
    $click = $this->db->query($sql, [], 'fetch');
    $this->assertEquals($tx, $click['tx_id']);
    $this->assertEquals($click['user_cookie'], $cookie);
}
调用任何
$This->assertEquals($tx,$click['tx\u id'])时引发此错误
$this->assertEquals($click['user\u cookie',$cookie)。但是我可以
var\u dump
这些断言中使用的任何变量


我尝试了来自的所有解决方案,但它们对我不起作用

这可能是您的
db
组件中的错误。它应该实现方法以确保PDO实例没有被序列化(并且可能实现在反序列化之后重新连接)

您没有共享有关
db
组件的任何信息,但可以通过以下方式实现:

public function __sleep() {
    $fields = (array) $this;
    unset($fields['pdo']);
    return array_keys($fields);
}

流程隔离要求要隔离的流程中的所有对象都可以序列化/取消序列化

您看到的错误与不支持PHP对象序列化/非序列化的特定对象有关

这首先意味着在您询问的情况下,您不能为该测试使用进程隔离

如果您仔细思考一下,并改变一些想法,了解这里发生了什么,为什么某些对象(如数据库连接)通常无法序列化,以及为什么进程隔离也可以使用序列化,也许我也会想到为什么数据库连接的进程隔离毕竟不是一个好主意

因此,尽管您在这里看到了导致错误的技术限制,但最后我要说的是,不作为同一测试套件的一部分在隔离的进程中运行基于数据库连接的测试是非常有意义的

这也许不是你所希望的答案

也许分而治之在这里是有意义的:将那些流程隔离工作的测试放在它自己的测试套件中,并为它配置流程隔离

对于另一个,也将同样的方法应用到他们自己的测试套件中


PHPUnit XML配置文件提供了设置,有时甚至需要有多个XML配置文件,这取决于使用的PHPUnit版本,也取决于测试运行程序的配置设置。

谢谢您的回答,但还有另一个问题,我需要隔离运行大多数甚至所有测试,因为我正在测试的逻辑使用cookies,phpunit抛出错误
无法修改头信息-头已发送
,因此我需要使用隔离(除非您知道另一种方式)但是我还需要使用DB连接:),所以我不认为我可以在这里使用测试分离,我将尝试序列化DB组件,正如@rob006提到的那样听起来更像是一个集成测试套件。如果这些测试同时需要(隔离和cookie)似乎不是那么容易测试的代码。测试很容易揭示设计缺陷是很常见的,你可能会经历到这一点(这并不是一件天生的坏事,只是说说而已)。有时,它有助于禁用会话的Cookie,例如,您也可以控制Phpunit XML配置文件中的PHPINI值。还有一条错误信息,你应该在其他问答条目中也找到一些“灵感”,但我现在不能特别好地推荐一个具体的。PDO之所以没有实现这些,是有原因的,在实现这些之前,有必要先了解这些推理(或者至少在考虑这些建议可能产生的后续问题时考虑它们)。没有规则W/O例外,只是说。