PHPUnit-Don';当数据提供程序返回空数组时,t失败

PHPUnit-Don';当数据提供程序返回空数组时,t失败,phpunit,Phpunit,我有一个PHPUnit测试,它使用@dataProvider。数据提供程序检查文件系统中的某些文件 但是,我在不同的环境中使用这个测试,这意味着可能会发生文件不存在的情况。这意味着dataProvider找不到任何东西,测试也不会执行 这会导致测试运行以失败告终 问题:配置PHPUnit的一种方法是忽略具有不产生任何结果的提供程序的测试吗?虽然我不知道有任何PHPUnit选项(这并不意味着不存在),但您可以使用如下内容: public function providerNewFileProvid

我有一个PHPUnit测试,它使用
@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完全忽略测试,那就不是一个可以接受的答案。记录跳过并不会忽略测试。在我的商店中,跳过测试的测试运行不是干净的运行。空数组应该意味着提供程序没有提供测试,而不是有测试要跳过。