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);
    }
}
当我在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(就像手册所说的那样),但仍然没有区别.
我记得以前以类似的方式工作,但我可能是错的.我错过了什么?
在此先感谢您的帮助.
PHP 5.3.3上的PHPUnit 3.4.14(取自PEAR)
Kin*_*nch 30
次要更新:从版本3.2(或其周围的某个地方)使用实例方法作为提供者是可以的.看看评论
提供者必须看起来像这样.
public static function providerLogger() {
    return array(
      array(new Logger)
    );
}
首先:如果使用低于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);
}
这里testAdd执行3次,每个第二级数组一次,它将从内部数组 s 接收值.您可能会注意到,测试将失败并为您提供一条消息,其中数据集的迭代(此处为#3,因为5 + 5不是6;))断言失败.
我有同样的问题,它解决了,当我删除空构造函数,这是自动生成的.我不知道为什么这解决了这个问题.我也没有像类这样命名的测试方法.提供者方法不需要是静态的,到目前为止我的测试运行没有静态.但是当我使提供者方法静态时也运行