如何访问dataProvider当前数据集的编号?

Ber*_*ter 5 php phpunit

在PHPUnit中,对于用a装饰的测试@dataProvider,有没有办法找出当前使用的数据集索引(在dataProvider提供的数组中)?

inp*_*put 5

方法 1 - 格式化数组

您必须格式化 dataProvider 方法以提供数组索引($key)以及$value

<?php

class DataProviderTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider provider
     */
    public function testMethod($key, $value)
    {
        if ($key === 1) {
            $this->assertEquals('two', $value, 'pass');
        }

        if ($key === 2) {
            $this->assertEquals('two', $value, 'fail');
        }
    }

    public function provider()
    {
        $data = array('one', 'two', 'three');

        $holder = array();
        foreach ($data as $key => $value) {
            $holder[] = array($key, $value);
        }

        return $holder;
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您在上面看到的,我格式化了提供程序以在两个方法参数中提供键和值。

方法 2 - 调用私有属性

由于您的评论,我进行了更多挖掘,并且发现了 PHPUnit 在内部使用的方法来获取失败时的 dataProvider 数组索引,该索引存储在PHPUnit_Framework_TestCase名为dataName.

我主要是 Magento 开发人员,我们使用EcomDev_PHPUnit 模块来帮助进行测试,它带有一个很好的反射助手来访问受限制的属性,因为 Magento 不是为测试而构建的,并且有很多,请参阅:https://github。 com/EcomDev/EcomDev_PHPUnit/blob/master/lib/EcomDev/Utils/Reflection.php

我找不到此属性的公共访问器,因此您必须使用反射,也许您可​​以打开拉取请求?

<?php

class DataProviderTest extends \PHPUnit_Framework_TestCase
{

    /**
     * @dataProvider provider
     */
    public function test($value)
    {
        $key = EcomDev_Utils_Reflection::getRestrictedPropertyValue($this, 'dataName');

        if ($value === 'zero') {
            $this->assertEquals($key, '0', 'pass');
        }

        if ($value === 'two') {
            $this->assertEquals($key, '1', 'fail');
        }
    }

    public function provider()
    {
        return array(
            array('zero'),
            array('one'),
            array('two')
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对于未来的 Google 员工:在更新版本的 PHPUnit 中(不确定从什么时候开始),在 `\PHPUnit\Framework\TestCase` 中有一个公共方法 `dataDescription()`,它返回私有 `dataName` 属性的值。虽然这只能在您使用字符串作为键时使用,但如果您只是在寻找数字键,则不会回答原始问题。 (5认同)
  • 在 PHPUnit 9 中,获取数据集索引/名称的方法已从“dataDescription”更改为“dataName”。 (3认同)
  • 这就是我现在正在做的事情。不过,我不太喜欢它,因为它看起来多余且低效(仅为数组键添加额外的循环)。我希望 PHPUnit 以某种方式公开数据集编号,因为当特定数据集的测试失败时它也会打印它。 (2认同)
  • @antriver 根据最新的 PHPDoc,`dataDescription()` 是在 5.4.0 中添加的。 (2认同)