PHPUnit: dataProvider问题

4
以下测试有什么问题:
<?php

class TestSomething extends PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider provider
     */
    public function testSomething($array, $expectedResult)
    {
        $this->assertEquals($array, $expectedResult);
    }

    public function provider()
    {
        return array(
            array(array(), array()),
        );
    }
}

?>

错误信息:

$phpunit index.php
PHP Warning:  Missing argument 1 for TestSomething::testSomething() in /var/www/tests/something-test/index.php on line 8
PHP Warning:  Missing argument 2 for TestSomething::testSomething() in /var/www/tests/something-test/index.php on line 8
PHP Notice:  Undefined variable: array in /var/www/tests/something-test/index.php on line 11
PHP Notice:  Undefined variable: expectedResult in /var/www/tests/something-test/index.php on line 11
PHP Fatal error:  Uncaught exception 'PHPUnit_Framework_ExpectationFailedException' with message 'Failed asserting that 
Array
(
    [0] => Array
        (
        )

    [1] => Array
        (
        )

)
 is equal to <string:testSomething>.' in /usr/share/php/PHPUnit/Framework/Constraint/IsEqual.php:164
Stack trace:
#0 /usr/share/php/PHPUnit/Framework/Assert.php(2087): PHPUnit_Framework_Constraint_IsEqual->fail(Array, '')
#1 /usr/share/php/PHPUnit/Framework/Assert.php(343): PHPUnit_Framework_Assert::assertThat(Array, Object(PHPUnit_Framework_Constraint_IsEqual), '')
#2 /var/www/tests/something-test/index.php(11): PHPUnit_Framework_Assert::assertEquals('testSomething', Array)
#3 /usr/share/php/PHPUnit/Framework/TestSuite.php(537): TestSomething->testSomething('testSomething', Array, 0)
#4 /usr/share/php/PHPUnit/Framework/TestSuite.php(816): PHPUnit_Framework_TestSuite::createTest(Object(ReflectionClass), 'testSomething')
#5 /usr/share/php/PHPUnit/Framework/TestSuite.php(224): PHPUnit_Framework_TestSuite->addTestMethod(Object(ReflectionClass), Object(Reflectio in /usr/share/php/PHPUnit/Framework/Constraint/IsEqual.php on line 164

感谢您的选择。

你确定没有漏掉任何括号/花括号吗? - Felipe
我看不到错误。谢谢。 - thom
4个回答

13

我也刚刚被同样的问题困扰了,我之前使用__construct()方法来设置内部变量。

我需要做的是创建一个function setUp() {},在其中进行设置。


我再次遇到了这个问题 - 但这次问题出现在注释上 - 我使用了:

/*
 * @dataProvider ....
 */

但是,注释必须以 /** 开始才能被识别。


1
我的评论以以下内容开头: /**+ 糟糕的错别字...浪费了30分钟来找问题... - Sam
哇,谢谢你。我一直很好地使用__construct(),直到我添加了dataProvider,然后一切都崩溃了,这是一个噩梦般的故障排除过程。如果不是因为你,我可能永远不会发现这个问题,谢谢! - Jeff Puckett
/* 和 /** 的区别是一个特别棘手的坑。 - piersb
1
现在可以使用Rector立即进行升级:https://github.com/rectorphp/rector/issues/2143 - Tomas Votruba

11

这是因为你的测试也作为构造函数被执行了:

class TestSomething extends PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider provider
     */
    public function testSomething($array, $expectedResult)
    {
        $this->assertEquals($array, $expectedResult);
    }

    // ...

}
为了兼容PHP4,您可以使用类名作为方法名来声明构造函数。这也是以不区分大小写的方式完成的(即:testSomething()被视为TestSomething的构造函数)。通常,您会在类名后附加Test关键字来防止发生这种情况(而不是在前面添加):
class SomethingTest extends PHPUnit_Framework_TestCase
{
    // ...
}

+1 很好的发现!我一直在寻找构造函数,因为我知道每个数据集都是通过它传递的,但完全忘记了 PHP4 中类名作为构造函数的特性。 - David Harkness
加油!这种构造函数太糟糕了!:( 谢谢。问题已解决! - thom
许多其他编程语言使用类名作为构造方法的名称,例如C++和Java。 - David Harkness

7

如果您因为phpunit运行数据提供程序函数作为测试并显示“风险测试”标志而到达这里,那么似乎自从phpunit 6(也许是6.3?)以来,phpunit不再忽略数据提供程序函数中的“test”前缀,例如 testAdditionProvider 。 将其重命名为当前文档中的additionProvider可以解决此问题。但我不确定是否完全正确。


0

如果您使用的是PHP pre-5.3.3:

您在建立类时是否给出了变量? 因为您的类和函数名称(TestSomething/testSomething)相同(不区分大小写)。 所以它将函数testSomething视为构造函数。


实际上,这个行为在5.3.3及以上版本中仍然存在,包括5.4。 - netcoder
根据 PHP 网站 (http://php.net/manual/en/language.oop5.decon.php) 的第二个示例,它应该被视为常规函数。但是,我自己还没有测试过。 - them_nl
我已经阅读了它,但我正在使用PHP 5.3... 因此,这个语句看起来是错误的。谢谢。 - thom
@thom:实际上是__construct - netcoder
@Max 'TheM' Klaversma:你说的部分是对的。*"从PHP 5.3.3开始,与命名空间类名的最后一个元素同名的方法将不再被视为构造函数。"* - netcoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接