簡體   English   中英

phpunit中的dbunit沒有截斷表

[英]dbunit in phpunit is not truncating the tables

我目前正在為我的項目使用PHPUnit和DBUnit。 我在DBUnit中遇到問題,因為DBUnit PHPUnit_Extensions_Database_TestCase Src類似乎沒有截斷測試數據庫上的現有數據。 所以這使我的插入測試在僅工作一次后失敗。

我使用的是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');
    }       
    ...
}

那么我該如何解決這個問題呢? 我在這里做錯了什么?

如果重寫setUp方法,PHPUnit將不會自動調用getDataSet方法。 您需要注意調用parent::setUp方法,否則PHPUnit不知道該怎么做;)。

我自己遇到了這個問題,這是我在深入研究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();
}

在此之前,我在Teardown()方法中手動截斷表,但我認為你會同意這個解決方案要好得多。

對於這個答案並沒有期待太多的榮譽,但我花了幾個小時試圖弄清楚為什么我的一個測試數據庫表沒有被截斷,導致上面描述的相同的重復輸入錯誤。 我的getDataSet()看起來像

function getDataSet() {

    $files = array('languages','interpreters','interp_languages',
        'interp_events','deft_events',
           //etc
    );

    $dataSets = array();
    foreach ($files as $file) {
        $dataSets[] = new PHPUnit_Extensions_Database_DataSet_MysqlXmlDataSet(
         $this->files_dir."/$file.xml");
    }

    return new PHPUnit_Extensions_Database_DataSet_CompositeDataSet($dataSets);
}

這項技術在其他測試類上運行良好。 碰巧我無意中從$ files中遺漏了我的一個xml數據文件名,因此DbUnit沒有加載該數據文件,而不是截斷表。 但是因為表中還有大量的行來自使用相同數據文件的其他測試,所以對我來說發生的事情並不明顯。

希望有一天能讓其他人免於撕裂她/他的眼球。

您需要有一個getDataSet()方法,否則PHPUnit會假定您沒有要修復的數據。

http://www.phpunit.de/manual/3.6/en/database.html

getDataSet()方法定義在執行每個測試之前數據庫的初始狀態應該如何。 數據庫的狀態通過DataSet和DataTable概念抽象,這兩個概念都由接口PHPUnit_Extensions_Database_DataSet_IDataSet和PHPUnit_Extensions_Database_DataSet_IDataTable表示。 下一節將詳細描述這些概念的工作原理以及在數據庫測試中使用它們的好處。

對於實現,我們只需要知道在setUp()期間調用getDataSet()方法一次以檢索fixture數據集並將其插入到數據庫中。 在示例中,我們使用工廠方法createFlatXMLDataSet($ filename)來表示通過XML表示形式的數據集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM