PHPUnit @dataProvider根本不起作用

2022-08-30 14:20:06

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

下面是实现数据提供程序的函数:

/**
 * 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 只是失败了:

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

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

有人知道为什么吗?


答案 1

最后,经过几个小时的催促这个测试文件,我发现仅仅定义构造函数就会破坏数据提供程序的功能。很高兴知道。

要解决此问题,只需调用父构造函数。以下是在我的情况下看起来的样子:

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

答案 2

如果你真的需要它,大卫·哈克尼斯(David Harkness)有正确的提示。代码如下:

public function __construct($name = NULL, array $data = array(), $dataName = '') {
    $this->preSetUp();
    parent::__construct($name, $data, $dataName);
}

推荐