当使用PHPUnit测试依赖于数据库的类时,getDataSet()方法提供数据作为整个测试套件的测试夹具。这很好,但是如何为特定测试提供数据?这种情况并不罕见,尤其是在使用最小化数据集时,每个测试都要求在所有测试使用的公共数据之上使用不同的数据库数据。我知道PDO对象是可用的,在我们的例子中,应用程序的本机数据库对象也可用(意思是,我们可以在应用程序中运行原始查询或使用其他功能),但是有一种方法可以插入数据这是由PHPUnit的DataSet容器驱动的,因此所有测试数据都以相同的方式处理,以提高清晰度并简化维护。
有没有办法实现这个目标?
答案 0 :(得分: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 */
}
答案 1 :(得分:5)
这是一个迟到的答案,但它对我猜的某些人仍然有用......
您可以通过调用execute
的{{1}}方法来完成此操作,您可以从IDatabaseOperation
获取该方法。您基本上可以使用PHPUnit_Extensions_Database_Operation_Factory
或CLEAN_INSERT
。
作为zerkms' second approach,您可以在每个需要特定数据的测试开始时调用它。例如:
INSERT
但是,此解决方案的优点是整个测试用例的数据集保持不变,因此:
public function testA() {
PHPUnit_Extensions_Database_Operation_Factory::INSERT()
->execute($this->getConnection(), $this->createXMLDataSet(__DIR__.'/fixtureA.xml'));
// Test code
}
操作(不是INSERT
),它将在公共数据集的所有行之后插入特定于测试的行。您还可以使用CLEAN_INSERT
操作从该公共数据集中删除一些不需要的行。DELETE
使其工作。