【问题标题】:Error PHPUnit with PDO and @runInSeparateProcess带有 PDO 和 @runInSeparateProcess 的 PHPUnit 错误
【发布时间】:2013-07-11 11:19:40
【问题描述】:

我正在尝试使用“@runInSeparateProcess”注释和 PDO 连接执行一个简单的 PHPUnit 测试,但它引发了以下异常:

PHPUnit_Framework_Exception:PHP 致命错误:未捕获的异常 'PDOException' with >>message 'You cannot serialize or unserialize PDO instances' in -:37

我就是不知道出了什么问题。 这是我的一段代码

<?php
require_once 'PHPUnit/Extensions/Database/TestCase.php';

/**
 * @runTestsInSeparateProcesses
 */
class myTest extends PHPUnit_Extensions_Database_TestCase{

    private $pdo = null;

    public function __construct() {

        $this->pdo = new Pdo('sqlite::memory:');        
        try{
        $this->pdo->exec('CREATE TABLE post (
                id INTEGER NOT NULL,
                title TEXT(100),
                PRIMARY KEY (id),
                UNIQUE (id)
            )'
        );
        } catch(PDOException $e){
            echo $e->getMessage();
        }
    }

    /**
     * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
     */
    public function getConnection(){  
        return $this->createDefaultDBConnection($this->pdo, 'sqlite');
    }

    /**
     * @return PHPUnit_Extensions_Database_DataSet_IDataSet
     */
    public function getDataSet(){       
        return $this->createFlatXMLDataSet(dirname(__FILE__).'/test.xml');
    }   

    protected function getSetUpOperation(){     
        return PHPUnit_Extensions_Database_Operation_Factory::CLEAN_INSERT();
    }   

    public function testFirst(){
        $this->assertEquals(1,1);
    }

    public function testSecond(){
        $this->assertEquals(1,1);
    }


}

【问题讨论】:

标签: php pdo phpunit


【解决方案1】:

PHPUnit 将在测试之间序列化和反序列化您的类,以便在全局范围内保留任何变量的值(这将包括 $pdo)。这可以防止一个测试修改变量并影响下一个测试;每个测试都从“干净”开始。

我相信您的解决方案是将 $pdo 的初始化移出构造函数并移入 getConnection() 方法。然后 PDO 对象不会被序列化。如果您担心为每个测试创建该连接的开销,只需检查您是否已经创建它并返回现有资源。

类似于下面的代码,它混合了您的代码和 PHPUnit 站点上的示例:http://phpunit.de/manual/3.7/en/database.html#database.tip-use-your-own-abstract-database-testcase

// only instantiate pdo once for test clean-up/fixture load
static private $pdo = null;

// only instantiate PHPUnit_Extensions_Database_DB_IDatabaseConnection once per test
private $conn = null;

/**
 * @return PHPUnit_Extensions_Database_DB_DefaultDatabaseConnection
 */
final public function getConnection()
{
    if ($this->conn === null) {
        if (self::$pdo == null) {
            self::$pdo = new PDO('sqlite::memory:');        
            try{
                $this->pdo->exec('CREATE TABLE post (
                    id INTEGER NOT NULL,
                    title TEXT(100),
                    PRIMARY KEY (id),
                    UNIQUE (id)
                )'
            );
            } catch(PDOException $e){
                echo $e->getMessage();
            }
        }
        $this->conn = $this->createDefaultDBConnection($this->pdo, 'sqlite');
    }

    return $this->conn;
}

【讨论】:

    猜你喜欢
    • 2016-01-22
    • 2014-09-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2013-01-13
    • 2013-06-06
    • 2014-12-28
    • 2013-12-10
    相关资源
    最近更新 更多