2012-02-21 26 views
6

使用PHPUnit測試依賴於數據庫的類時,getDataSet()方法提供的數據可用作整個測試套件的測試用具。這很好,但是如何爲特定測試提供數據?這並不罕見,特別是在使用最小化數據集時,每個測試都需要在所有測試使用的公共數據之上使用不同的數據庫數據。我知道PDO對象是可用的,在我們的例子中,應用程序的本地DB對象也是可用的(也就是說,我們可以運行原始查詢或在應用程序中使用其他功能),但是有一種方法可以插入數據這是PHPUnit的DataSet容器驅動的,因此所有測試數據都以相同的方式處理,以提高清晰度和易於維護。如何使用PHPUnit插入測試用例特定的數據庫行

有沒有辦法做到這一點?

回答

4

這是一個遲到的答案,但它仍然是一些人我猜有用...

您可以通過調用IDatabaseOperationexecute方法來完成此操作,您可以從PHPUnit_Extensions_Database_Operation_Factory獲取該方法。你基本上會使用CLEAN_INSERTINSERT

作爲zerkms' second approach,您可以在每個需要特定數據的測試開始時調用它。例如:

public function testA() { 
    PHPUnit_Extensions_Database_Operation_Factory::INSERT() 
    ->execute($this->getConnection(), $this->createXMLDataSet(__DIR__.'/fixtureA.xml')); 

    // Test code 
} 

然而,這種解決方案的優點是,整個測試用例的數據集保持不變,所以:

  • 試驗方法彼此保持獨立(而在zerkms的方法中,如果你沒有/忘記在另一個測試方法中指定一個數據集,它將重新使用改變數據集的前一個(隨機?)方法中的數據集,這非常難看且很容易出錯) 。在這裏,任何其他沒有這種調用的測試在開始時都會照常使用測試用例數據集。
  • 您可以在公共(測試用例)數據集之上構建您的測試數據集。如果使用INSERT操作(而不是CLEAN_INSERT),它將在公共數據集的所有行之後插入特定於測試的行。您也可以使用DELETE操作從該通用數據集中刪除一些不需要的行。
  • 順便說一句,不調用onSetUp()即使測試用例的設置操作已更改,也可以使用此工作。
8

你可以按照這樣的骯髒伎倆:

protected function getDataSet() 
{ 
    if (in_array($this->getName(), array('testA', 'testB', '...'))) { 
     return $this->createXMLDataSet(__DIR__ . '/_fixtures/fistureA.xml'); 
    } 

    return $this->createXMLDataSet(__DIR__ . '/_fixtures/fixtureB.xml'); 
} 

小記:$this->getName()返回當前測試方法的名稱

另一種方法是重新運行在開始測試的設置操作:

public function testA() 
{ 
    $this->getDatabaseTester()->setDataSet($this->createFlatXMLDataSet(__DIR__ . '/_fixtures/fixtureForTestA.xml')); 
    $this->getDatabaseTester()->onSetUp(); 

    /* your test code */ 
} 
+0

我認爲這對早期版本來說簡單得多。他們爲什麼使它變得複雜? – eddy147 2012-08-04 07:23:12

+0

@ eddy147:這是我在dbunit中唯一見過的版本 – zerkms 2012-08-04 09:10:03

+0

我根本不應該使用dbunit,而是根據它的外觀編寫我自己的自定義準備數據集 – eddy147 2012-08-05 19:41:35

相關問題