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