phpunit中的dbunit没有截断表

Los*_*can 16 php phpunit dbunit unit-testing

我目前正在为我的项目使用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');
    }       
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

hak*_*kre 38

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

  • 我没有在我的测试中覆盖setUp方法,但它仍然没有截断表.DBUnit在什么时候实际截断了数据库? (3认同)

小智 5

我自己遇到了这个问题,这是我在深入研究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();
}
Run Code Online (Sandbox Code Playgroud)

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