PHPUnit 和数据提供程序的问题

2022-08-30 18:27:40

我有以下测试用例:

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);
    }

}

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

PHPUnit 3.4.14 by Sebastian Bergmann.

..........

Time: 0 seconds, Memory: 5.75Mb

OK (1 tests, 0 assertions)

测试应该会失败,但不会。我尝试过:

public function providerLogger() {
    return array(new Logger);
}

但我得到:

The data provider specified for LoggerTest::testAddStream is invalid.

我尝试声明它(如手册所说),但仍然没有区别。static

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

提前感谢您的帮助。

PHPUnit 3.4.14(取自 PEAR)在 PHP 5.3.3 上


答案 1

次要更新:从版本 3.2(或大约 3.2)开始,可以使用实例方法作为提供程序。查看评论


提供程序必须如下所示。

public static function providerLogger() {
    return array(
      array(new Logger)
    );
}

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

数组 s 很重要。这并不难理解。外部数组对于测试应调用的每次迭代都有一个值。在这里,测试只被调用一次。内部数组是调用测试时使用的参数(按顺序)。测试只需要一个参数,因此内部数组始终需要一个值。另一个小例子

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);
}

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


答案 2

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


推荐