PHPunit错误输出Exception:即使它不应该,也不允许序列化'SplFileInfo'

时间:2015-08-27 20:09:50

标签: php phpunit

我有一个奇怪的错误。尝试在遗留代码库中实现PHPunit。在代码库中有一些关于设置包含路径的逻辑,这会弄乱phpunit而我看不清楚。

代码:

$includePath = (realpath((__DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'php')) . PATH_SEPARATOR);
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(__DIR__));
foreach ($iterator as $fileInfo) {
    if ('.' == $fileInfo->getFilename()) {
        $includePath .= ($fileInfo->getPath() . PATH_SEPARATOR);
    }  
}
set_include_path($includePath);

如果我对$ includePath进行硬编码,那么它的工作正常。但是,在我的引导程序文件中使用此代码时出现错误:

  

例外:不允许序列化'SplFileInfo'

每次测试。对我来说这没有意义,因为我没有尝试在测试中的任何地方使用RecursiveDirectoryIterator,而且我也没有尝试序列化任何RecursiveDirectoryIterator文件。这很奇怪。

我的单元测试看起来像:

class ReportTest extends PHPUnit_Framework_TestCase {



    public function testAssertTrue() {
        $this->assertTrue(true);
    }
}

我运行phpunit,如:

phpunit --bootstrap tests/bootstrap.php tests

引导程序在顶部有这些行(包含路径设置),然后包括其他内容,如我们的数据库连接等。

错误如下:

$ phpunit --bootstrap tests/test_bootstrap.php tests
PHPUnit 4.8.6 by Sebastian Bergmann and contributors.

EEEEEEEEE

Time: 340 ms, Memory: 19.00Mb

There were 9 errors:

1) ReportTest::testAssertTrue
Exception: Serialization of 'SplFileInfo' is not allowed

.... etc

1 个答案:

答案 0 :(得分:4)

RecursiveDirectoryIterator正在为SplFileInfo返回foreach ($iterator as $fileInfo)

该函数/类之外的全局命名空间中的代码是什么? PHPunit将备份然后恢复全局变量 - 在phpunit.xml文件中使用backupGlobals进行设置。至少在最近版本中code that performs that backup会从该代码中显示为unserialize(serialize($value));类不喜欢的SplFileInfo

如果您可以将该设置放入类中,并且不在全局空间中,则不会尝试“备份”。

或者当你完成它时可能只是unset($iterator);