我有一个测试方法依赖于另一个本身在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);
}
Run Code Online (Sandbox Code Playgroud)
我也有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);
}
}
Run Code Online (Sandbox Code Playgroud)
作为现在的解决方法,我已将结果存储在测试之间的静态属性中.
问题是由以下几个因素造成的:
<name> with data set #<x>。@depends不接受多个单词。有一个巧妙的解决方法:覆盖TestCase::getDataSetAsString以返回注释将接受的名称。由于必需的TestCase字段是私有的,这会造成一些问题,但是使用 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);
}
}
Run Code Online (Sandbox Code Playgroud)
显然,这不是一个长久之计。最好对接收数据的方法的每个测试结果运行一次相关测试。您可以向 PHPUnit 提交功能请求或拉取请求。
| 归档时间: |
|
| 查看次数: |
2796 次 |
| 最近记录: |