phpunit 中的 dbunit 没有截断表

2022-08-31 00:16:04

我目前正在使用PHPUnit和DBUnit进行我的项目。我在DBUnit中有一个问题,因为DBUnit PHPUnit_Extensions_Database_TestCaseSrc类似乎没有截断测试数据库上的现有数据。因此,这使得我的插入测试在仅工作一次后失败。

我正在使用mysql,这是我的代码:

abstract class Generic_Tests_DatabaseTestCase extends PHPUnit_Extensions_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;

    final public function getConnection()
    {
        if ($this->conn === null) {
            if (self::$pdo == null) {
                self::$pdo = new PDO( "mysql:dbname=db;host=localhost", "root", "pass" );
            }
            $this->conn = $this->createDefaultDBConnection(self::$pdo, "db");
        }

        return $this->conn;
    }
}

class DbopTest extends Generic_Tests_DatabaseTestCase
{       
    private $db;

    protected function setup(){
        $this->db = null;
    }

    public function getDataSet(){
        return $this->createMySQLXMLDataSet(dirname(__FILE__) . '/../rows.xml');
    }       
    ...
}

那么我该如何解决这个问题呢?我在这里做错了什么?


答案 1

如果重写该方法,PHPUnit 将不会自动调用您的方法。您需要注意调用该方法,否则PHPUnit不知道该做什么;)。setUpgetDataSetparent::setUp


答案 2

我自己遇到了这个问题,这就是我在深入研究PHPUnit源代码后如何解决它的方法。看起来PHPUnit_Extensions_Database_TestCase类的默认行为是返回 PHPUnit_Extensions_Database_Operation_Factory::NONE()。对于你需要什么,以及 PHPUnit 文档似乎如何暗示它应该如何工作,你需要重写该方法以返回 PHPUnit_Extensions_Database_Operation_Factory::TRUNCATE()。

幸运的是,这是相当直截了当的。你只需要将以下内容添加到你的 TestCase 类中。

protected function getTearDownOperation()
{
    return \PHPUnit_Extensions_Database_Operation_Factory::TRUNCATE();
}

在此之前,我在我的Delawdown()方法中手动截断表,但我认为你会同意这个解决方案要好得多。


推荐