PHPunit 出错并出现异常 : Serialization of 'SplFileInfo' is not allowed even though it shouldn't

标签 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 进行硬编码,那么它就可以正常工作。但是,在我的引导文件中使用此代码时,我收到错误:

Exception: Serialization of 'SplFileInfo' is not allowed

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

我的单元测试如下所示:

class ReportTest extends PHPUnit_Framework_TestCase {



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

我运行 phpunit 如下:

phpunit --bootstrap tests/bootstrap.php tests

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

错误看起来像:

$ 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

最佳答案

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

该代码是否位于函数/类之外的全局命名空间中? PHPunit 将备份然后恢复全局变量 - 在 phpunit.xml 文件中使用 backupGlobals 设置。 code that performs that backup至少在最近的版本中,该代码似乎执行了 unserialize(serialize($value)); ,而 SplFileInfo 类不喜欢这样做。

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

或者也许只是在完成后unset($iterator);

关于PHPunit 出错并出现异常 : Serialization of 'SplFileInfo' is not allowed even though it shouldn't,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32258538/

相关文章:

php - 无法在 laravel 应用程序中保存资源传递给 Illuminate\Database\Grammar::parameterize() 的参数 1 必须是数组类型,给定为 null

php - 无论我在哪个目录中,如何在 Windows 命令行中运行 phpunit 命令?

zend-framework - PHPunit 使用 POST 和表单调度 Controller 操作

laravel - 如何为 Laravel 更新密码表单编写测试?

PHP动态获取siteurl

php - 我在 php 中寻找比 substr_count($string, $needle, $offset, $length) 更好的算法复杂度

php - 帮助调试 EvalMath 的未定义偏移量

php - MySQL Insert 是否允许不指定所有字段?

mysql - 有没有办法将 RC Selenium 测试错误/失败记录到数据库中?

Laravel 黄昏报告 "General error: 5 database is locked"和 "Operation timed out"