我有一个测试方法,该方法取决于另一种方法,该方法本身使用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/

    10-13 04:25