在 PHPUnit 中,对于用 @dataProvider
修饰的测试,有没有办法找出当前使用的数据集的索引(在 dataProvider 提供的数组中)?
最佳答案
方法一——格式化数组
您必须格式化 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;
}
}
正如您在上面看到的,我格式化了提供程序以在两个方法参数中提供键和值。
方法二——调用私有(private)属性
因为你的评论我做了更多的挖掘,我发现了 PHPUnit 在内部使用的方法来获取失败时的 dataProvider 数组索引,该索引存储在测试用例类的私有(private)属性中 (PHPUnit_Framework_TestCase
) 称为 dataName
。
我主要是一名 Magento 开发人员,我们使用 EcomDev_PHPUnit module为了帮助测试,它带有一个很好的反射助手来访问受限制的属性,因为 Magento 不是为测试而构建的并且有很多这样的属性,请参阅:https://github.com/EcomDev/EcomDev_PHPUnit/blob/master/lib/EcomDev/Utils/Reflection.php
我找不到这个属性的公共(public)访问器,所以你必须使用反射,也许你可以打开一个拉取请求?
<?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')
);
}
}
关于php - 如何获取dataProvider当前数据集的编号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27300035/