0

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

PHPUnit_Framework_Exception:PHP 致命错误:未捕获的异常 'PDOException' 和 >> 消息“您无法序列化或反序列化 PDO 实例”在 -: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);
    }


}
4

1 回答 1

2

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

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

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

// 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;
}
于 2013-12-14T22:56:56.483 回答