PHPUnit和数据提供者的问题

net*_*der 21 php phpunit unit-testing dataprovider

我有以下测试用例:

include_once('../Logger.php');

class LoggerTest extends PHPUnit_Framework_TestCase {

    public function providerLogger() {
        return new Logger;
    }

    /**
     * @dataProvider providerLogger
     */
    public function testAddStream($logger) {
        $this->assertTrue(false);
    }

}
Run Code Online (Sandbox Code Playgroud)

当我在PHPUnit中运行它时,我得到:

PHPUnit 3.4.14 by Sebastian Bergmann.

..........

Time: 0 seconds, Memory: 5.75Mb

OK (1 tests, 0 assertions)
Run Code Online (Sandbox Code Playgroud)

测试应该失败,但事实并非如此.我试过:

public function providerLogger() {
    return array(new Logger);
}
Run Code Online (Sandbox Code Playgroud)

但我得到:

The data provider specified for LoggerTest::testAddStream is invalid.
Run Code Online (Sandbox Code Playgroud)

我试着宣布它static(就像手册所说的那样),但仍然没有区别.

我记得以前以类似的方式工作,但我可能是错的.我错过了什么?

在此先感谢您的帮助.

PHP 5.3.3上的PHPUnit 3.4.14(取自PEAR)

Kin*_*nch 30

次要更新:从版本3.2(或其周围的某个地方)使用实例方法作为提供者是可以的.看看评论


提供者必须看起来像这样.

public static function providerLogger() {
    return array(
      array(new Logger)
    );
}
Run Code Online (Sandbox Code Playgroud)

首先:如果使用低于3.3的phpunit版本,则该方法必须是静态的.

阵列的人非常重要.它并不难理解.外部数组在每次迭代时都有一个值,应该调用测试.这里的测试只需要调用一次.内部数组是调用测试的参数(按顺序).您的测试只需要一个参数,因此内部数组总是只需要一个值.另一个小例子

public static function addTestProvider () {
    return array(
        /* First + Second = third? */
        array(1,4,5),
        array(3,3,6),
        array(5,5,6)
    );
}
public function testAdd ($a, $b, $result) {
    $this->assertEquals($result, $a + $b);
}
Run Code Online (Sandbox Code Playgroud)

这里testAdd执行3次,每个第二级数组一次,它将从内部数组 s 接收值.您可能会注意到,测试将失败并为您提供一条消息,其中数据集的迭代(此处为#3,因为5 + 5不是6;))断言失败.

  • 我错过了什么吗?为什么它必须是静态的?[PHPUnit手册也使用常规方法](http://www.phpunit.de/manual/3.4/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.data-providers) (15认同)
  • +1用于突出显示版本号。 (2认同)
  • 我们已经回到原点了。从 PHPUnit v10 开始,数据提供程序必须是静态的 - https://docs.phpunit.de/en/10.0/writing-tests-for-phpunit.html#data-providers (2认同)

Chr*_*ann 5

我有同样的问题,它解决了,当我删除空构造函数,这是自动生成的.我不知道为什么这解决了这个问题.我也没有像类这样命名的测试方法.提供者方法不需要是静态的,到目前为止我的测试运行没有静态.但是当我使提供者方法静态时也运行

  • 我还发现,你可以使用__construct,但不要忘记调用parent :: _构造是这样的:公共职能__construct($名= NULL,数组$数据=阵列(),$数据名称=""){//. .. parent :: __ construct($ name,$ data,$ dataName); } (7认同)