数据提供者与测试用例设置流程分离的原因是它们可以被定义为外部类方法。它也是关于将数据注入测试的。考虑这样的代码:
class SampleTest extends PHPUnit_Framework_TestCase
{
public function __construct($name = null, array $data = array(), $dataName = '') {
parent::__construct($name, $data, $dataName);
var_dump('constructed');
}
public static function setUpBeforeClass() {
parent::setUpBeforeClass();
var_dump('beforeClass');
}
public function setUp(){
var_dump('before');
}
/**
* @dataProvider sampleDataProvider
*/
public function testMethod($expected, $actual) {
var_dump('test');
$this->assertEquals($expected, $actual);
}
public function sampleDataProvider() {
var_dump('dataProvider');
return [
[1, 1],
[2, 2],
];
}
}
运行它时,你会注意到首先构造了SampleTest 实例,然后调用了dataProvider,然后创建了SampleTest 的两个实例(一个测试方法乘以来自dataprovider 的两个数据集),然后运行beforeClass 方法,然后运行测试方法运行两次,注入来自提供者的数据集。
目前尚不清楚您的特定用例是什么,但可能可以将上述案例重构为类似:
class AnotherSampleTest extends PHPUnit_Framework_TestCase
{
public function testMethod() {
foreach ($this->sampleDataProvider() as $dataSet) {
list($expected, $actual) = $dataSet;
$this->assertEquals($expected, $actual);
}
}
public function sampleDataProvider() {
return [
[1, 1],
[2, 2],
];
}
}
这里sampleDataProvider 只是一个常规方法,所以你负责如何以及何时调用它,无论如何它会在setUpBeforeClass 和setUp 之后被调用,所以它可以访问在那里设置或修改的任何东西,这样您就可以进行任何需要的调整。
这种方法的缺点是您实际上无法将一种测试方法拆分为多个。因此,与每个只有几个断言的多个测试相比,这将是一个具有多个断言的测试。此外,您可能需要特别注意设置(我的意思是您可能需要在每次迭代之前刷新 smth) - 可以通过手动调用 setUp 来解决(乍一看)。
不要认为如果没有关于您的特定用例的一些细节就可以提出任何进一步的建议。