将依赖项与数据提供程序相结合

iai*_*999 11 php phpunit

我有一个测试方法依赖于另一个本身在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)

作为现在的解决方法,我已将结果存储在测试之间的静态属性中.

Dav*_*ess 2

问题是由以下几个因素造成的:

  • 每个测试结果都存储在一个数组中,并使用测试名称作为键。
  • 接收数据的测试的名称是<name> with data set #<x>
  • 注释@depends不接受多个单词。

有一个巧妙的解决方法:覆盖TestCase::getDataSetAsString以返回注释将接受的名称。由于必需的TestCase字段是私有的,这会造成一些问题,但是使用 PHP 5.3.2+,您可以解决这个问题。

重要提示:不幸的是,您无法为每个数据行(仅一个特定行)运行相关测试。如果您的数据提供程序仅返回一行数据,那么这不是问题。

这是带有示例测试的代码。请注意,您不必命名数据行。如果您忽略该'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);
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,这不是一个长久之计。最好对接收数据的方法的每个测试结果运行一次相关测试。您可以向 PHPUnit 提交功能请求或拉取请求。