PHPUnit-Don';当数据提供程序返回空数组时,t失败
我有一个PHPUnit测试,它使用PHPUnit-Don';当数据提供程序返回空数组时,t失败,phpunit,Phpunit,我有一个PHPUnit测试,它使用@dataProvider。数据提供程序检查文件系统中的某些文件 但是,我在不同的环境中使用这个测试,这意味着可能会发生文件不存在的情况。这意味着dataProvider找不到任何东西,测试也不会执行 这会导致测试运行以失败告终 问题:配置PHPUnit的一种方法是忽略具有不产生任何结果的提供程序的测试吗?虽然我不知道有任何PHPUnit选项(这并不意味着不存在),但您可以使用如下内容: public function providerNewFileProvid
@dataProvider
。数据提供程序检查文件系统中的某些文件
但是,我在不同的环境中使用这个测试,这意味着可能会发生文件不存在的情况。这意味着dataProvider找不到任何东西,测试也不会执行
这会导致测试运行以失败告终
问题:配置PHPUnit的一种方法是忽略具有不产生任何结果的提供程序的测试吗?虽然我不知道有任何PHPUnit选项(这并不意味着不存在),但您可以使用如下内容:
public function providerNewFileProvider()
{
//get files from the "real" provider
$files = $this->providerOldFileProvider();
//no files? then, make a fake entry to "skip" the test
if (empty($files)) {
$files[] = array(false,false);
}
return $files;
}
/**
* @dataProvider providerNewFileProvider
*/
public function testMyFilesTest($firstArg,$secondArg)
{
if (false === $firstArg) {
//no files existing is okay, so just end immediately
$this->markTestSkipped('No files to test');
}
//...normal operation code goes here
}
当然,这是一个解决办法,但它应该可以阻止出现错误。显然,无论您做什么,都将取决于是否允许第一个(或任意)参数为
false
,但您可以调整以适合您的测试。您也可以在数据提供程序中将测试标记为跳过,这样它就不会失败,也不必按照另一个答案中的建议添加包装器数据提供程序
public function fileDataProvider()
{
$files = $this->getTestFiles();
if (empty($files)) {
$this->markTestSkipped('No files to test');
}
return $files;
}
/**
* @dataProvider fileDataProvider
*/
public function testMyFilesTest($firstArg, $secondArg)
{
//...normal operation code goes here
}
+1尽管为了清晰起见,我会使用
self::markTestSkipped('No file to test')
。当然,您需要使用@dataProvider provider newfileprovider
对测试进行注释。在我接受这个答案之前,我会等待其他人的响应,但我认为这是唯一正确的解决方案。如果我有一个没有运行的测试,那么它会在覆盖范围中留下一个“缺口”,所以我猜PHPUnit的人会希望它运行或被跳过。在执行任何测试之前,数据提供程序都会被调用,因为PHPUnit想对执行的测试数量进行一些计算。数据提供程序是否应该返回一个空数组作为用例是有争议的,但通常情况下,它们是用来返回数据以执行测试的——不这样做通常是错误的。如果不是,让测试人员添加代码以反映这种与一般情况的偏差是一种方法。感谢«数组(false,false)»解决方案使我的测试工作正常!以下答案将PHPUnit报告跳过测试视为可接受答案。但是如果你想让PHPUnit完全忽略测试,那就不是一个可以接受的答案。记录跳过并不会忽略测试。在我的商店中,跳过测试的测试运行不是干净的运行。空数组应该意味着提供程序没有提供测试,而不是有测试要跳过。