31

我已阅读有关该主题的文档,并且我的代码遵循数据提供者实现的所有要求。首先,这是测试的完整代码,以防万一。

这是实现数据提供者的函数:

/**
 * Test the createGroup function
 *
 * @return void
 * @author Tomas Sandven <tomas191191@gmail.com>
 *
 * @dataProvider provideFileImportTests_good
 **/
public function testCreateGroup($file, $groupname, $group, $mapping)
{
    // Create a test group
    $id = $this->odm->createGroup($groupname, $group);

    // Try to load it back out
    $result = R::load(OmniDataManager::TABLE_GROUP, $id);

    // Check that the result is not null
    $this->assertFalse(is_null($result));

    return $id;
}

PHPUnit 只是失败了:

tests\broadnet\broadmap\OmniDataManagerTest::testCreateGroup() 缺少参数 1

我已经尝试die();在数据提供程序函数中杀死应用程序(),但它从未发生过。数据提供者函数在同一个类中公开可用,函数名称中没有拼写错误,并且testCreateGroup函数在注释中的注释中引用了它,但从未调用数据提供者函数。

有人知道为什么吗?

4

8 回答 8

74

最后,在对这个测试文件进行了数小时的测试后,我发现仅仅定义构造函数会破坏数据提供者的功能。很高兴知道。

要修复它,只需调用父构造函数。这是我的情况:

public function __construct()
{
    // Truncate the OmniDataManager tables
    R::wipe(OmniDataManager::TABLE_GROUP);
    R::wipe(OmniDataManager::TABLE_DATA);

    parent::__construct();   // <- Necessary
}

正如David HarknessVasily在评论中指出的那样,构造函数覆盖必须匹配基类构造函数的调用签名。在我的例子中,基类构造函数不需要任何参数。我不确定这是否在较新版本的 phpunit 中发生了变化,或者它是否取决于您的用例。

无论如何,Vasily 的示例可能更适合您:

public function __construct($name = null, array $data = array(), $dataName = '')
{
    // Your setup code here

    parent::__construct($name, $data, $dataName)
}
于 2012-04-16T15:53:41.780 回答
49

如果你真的需要它,大卫哈克尼斯有正确的提示。这是代码:

public function __construct($name = NULL, array $data = array(), $dataName = '') {
    $this->preSetUp();
    parent::__construct($name, $data, $dataName);
}
于 2013-05-02T07:19:25.887 回答
20

为了强调micro_user提出的观点,@dataProvider注释必须在 docblock 注释中。即这样做:

/**
 * @dataProvider myDataProvider
 *
 */
public function testMyMethod(...)
{
  ...
}

不要这样做,因为它不起作用:

/*
 * @dataProvider myDataProvider
 *
 */
public function testMyMethod(...)
{
  ...
}
于 2017-05-04T16:20:21.450 回答
15

对我来说,只有删除构造函数才有效。即使使用最新的稳定版本的 PHPUnit (6.0.9),在我的类测试中调用父构造函数也会破坏注释。

我只是将我拥有的代码移到了在我的单元测试运行之前调用__constructor的函数中。setUp

于 2017-03-16T20:08:28.637 回答
7

确保 dataProvider 拼写正确... @dataProvidorvs@dataProvider

在需要数据提供者的测试功能中,需要一个文档块,其中包含

/**
* @dataProvider providerItCanTest
*//
于 2016-03-31T17:27:41.457 回答
3

该错误意味着您的 data-provider 方法返回的数据数组中至少有一个为空。例如:

public function dataProvider() {
    return array(
        array(1, 2, 3),
        array(),           // this will cause a "Missing argument 1" error
        array(4, 5, 6)
    );
}

因为您正在动态生成数据数组,所以您需要调试数据源并弄清楚为什么会这样。

于 2012-04-16T15:36:22.603 回答
2

花了几个小时试图弄清楚 dataProvider 注释有什么问题。它根本没有被调用。

就我而言,问题是 opcache。检查 php.ini 以确保 opcache.save_comments 已启用:

php -r "phpinfo();" | grep opcache.save_comments

要启用它,请将其添加到 php.ini (或 /usr/local/php5/php.d/20-extension-opcache.ini 在我的情况下,因为我正在使用来自 liip.ch 的 php for osx):

[opcache]
opcache.save_comments=1
于 2019-03-17T11:33:23.487 回答
1

你好,任何仍然从谷歌来到这里的人 :) 我正在使用 PHP 7.0.5 和 PHPUnit 5.3.2。

正如@hubro 提到的 - 不要使用__construct()它,因为它会破坏一些 PHPUnit 注释。是一个包含更多细节的 SO 胎面。

我的测试类MyStuffTest扩展MyFancyTestcase了扩展PHPUnit_Framework_TestCaseMyFancyTestcase使用过__construct(),我得到了同样的错误。它应该setupBeforeClass()用来设置所有测试用例之间共享的静态数据 - 数据库连接等,不需要__construct(). DataProvider 现在可以工作了。

于 2016-05-03T08:23:52.997 回答