PHPUnit @dataProvider根本不起作用

Hub*_*bro 28 php phpunit

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

这是实现数据提供者的功能:

/**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

PHPUnit失败了:

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

我试过杀死die();数据提供程序函数中的application(),它永远不会发生.数据提供程序函数在同一个类中公开可用,函数名中没有拼写错误,函数testCreateGroup在注释的注释中引用它,但从不调用数据提供程序函数.

请解释原因

谢谢

Hub*_*bro 68

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

要修复它,只需调用父构造函数.以下是我的案例:

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

    parent::__construct();   // <- Necessary
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以拥有自定义构造函数,但必须注意接受相同的参数并将它们传递给父构造函数. (11认同)
  • 你还调用了父:: __构造函数()吗?通常,您不会为测试用例定义构造函数,而是使用setUp()函数. (5认同)
  • `parent :: __ constructor()`不是静态函数调用. (2认同)
  • 就我而言,正如David Harkness所建议的那样,只有在使自定义构造函数的签名与父构造函数的签名相同之后,dataProvider才开始工作-公共函数__construct($ name = null,array $ data = array(),$ dataName =' ')并将所有参数传递给parent :: __ construct($ name,$ data,$ dataName)。 (2认同)

小智 46

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

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

  • +1,这应该被标记为正确的答案 (6认同)
  • 这也特别为我解决了这个问题,调用没有参数的parent :: construct()没有.谢谢 (5认同)

Ama*_*nut 10

对我来说,只删除构造函数已经工作.在我的类测试中调用父构造函数也破坏了注释,即使使用最新的PHPUnit稳定版本(6.0.9)也是如此.

我只是将我的代码移动__constructorsetUp我的单元测试运行之前调用的函数.


dar*_*enp 10

为了强调micro_user所做的这一点,@dataProvider注释必须在docblock注释中.即做到这一点:

/**
 * @dataProvider myDataProvider
 *
 */
public function testMyMethod(...)
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

/*
 * @dataProvider myDataProvider
 *
 */
public function testMyMethod(...)
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

  • 你又节省了一天:) (4认同)
  • 你节省了一天 (3认同)
  • 很高兴听到它。:-) (2认同)

小智 7

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

在需要数据提供者的测试函数中,需要一个包含

/**
* @dataProvider providerItCanTest
*//
Run Code Online (Sandbox Code Playgroud)