我有一个测试方法,该方法取决于另一种方法,该方法本身使用PHPUnit中的数据提供程序:
/**
* @dataProvider getFields
*/
public function testCanDoSomeStuff($parm1, $parm2) {
$result = my_func($parm1, $parm2);
$this->assertNotNull($result);
return $result;
}
/**
* @depends testCanDoSomeStuff
*/
public function testCanDoSomeMoreStuff($result) {
$this->assertNotNull($result);
}
我也有一个
getFields()
数据提供程序功能,无需在此处显示。依赖数据提供者的第一个测试通过-
$result
不为null。我希望测试结果将作为
$result
参数传递给相关测试。但是,testCanDoSomeMoreStuff
函数接收到NULL
参数,并且测试失败。更新
这个简单的测试用例演示了该问题:
class MyTest extends PHPUnit_Framework_TestCase {
/**
* @dataProvider myFunc
*/
public function testCanDoSomeStuff($value) {
$this->assertNotNull($value);
return $value;
}
/**
* @depends testCanDoSomeStuff
*/
public function testCanDoSomeMoreStuff($value) {
$this->assertNotNull($value);
}
/**
* Data provider function
*/
public function myFunc() {
$values = array('22');
return array($values);
}
}
作为目前的解决方法,我已将结果存储在测试之间的静态属性中。
最佳答案
该问题是由以下几个因素导致的:
<name> with data set #<x>
。 @depends
批注不接受多个单词。 有一个解决方法:覆盖
TestCase::getDataSetAsString
以返回注释将接受的名称。由于必需的TestCase
字段是私有(private)的,因此这会造成一些问题,但是使用PHP 5.3.2+可以解决此问题。这是带有示例测试的代码。请注意,您不必命名数据行。如果您不使用
'foo'
键,则将@depends
更改为testOne-0
。class DependencyTest extends PHPUnit_Framework_TestCase
{
/**
* @dataProvider data
*/
public function testOne($x, $y) {
return $x + $y;
}
public function data() {
return array(
'foo' => array(1, 2),
);
}
/**
* @depends testOne-foo
*/
public function testTwo($z) {
self::assertEquals(3, $z);
}
protected function getDataSetAsString($includeData = false) {
if (!$includeData && $this->getPrivateField('data')) {
return '-' . $this->getPrivateField('dataName');
}
return parent::getDataSetAsString($includeData);
}
private function getPrivateField($name) {
$reflector = new ReflectionProperty('PHPUnit_Framework_TestCase', $name);
$reflector->setAccessible(true);
return $reflector->getValue($this);
}
}
显然,这不是一个长期的解决方案。最好从接收数据的方法中为每个测试结果运行一次相关测试。您可以向PHPUnit提交功能请求或请求请求。
关于php - 将依赖项与数据提供者相结合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11629580/