2012-02-21 55 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

相关问题