gpt4 book ai didi

php - 将依赖项与数据提供者相结合

转载 作者:可可西里 更新时间:2023-10-31 22:14:55 25 4
gpt4 key购买 nike

我有一个测试方法依赖于另一种方法,该方法本身使用 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 不为空。

我希望测试的结果将作为 $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注释不接受多个单词。

有一个 hacky 解决方法:override TestCase::getDataSetAsString返回注释将接受的名称。这有点问题,因为所需的 TestCase字段是私有(private)的,但是使用 PHP 5.3.2+ 可以解决这个问题。

Important: Unfortunately, you cannot have the dependent test run for every data row--only one specific row. If your data provider returns only one row of data, this isn't an issue.

这是带有示例测试的代码。请注意,您不必为数据行命名。如果你离开 'foo'键,更改 @dependstestOne-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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com