【问题标题】:PHPUnit RuntimeException: Instances of Aws\S3\S3Client cannot be serializedPHPUnit RuntimeException:无法序列化 Aws\S3\S3Client 的实例
【发布时间】:2017-12-06 17:22:02
【问题描述】:

在我的 CakePHP 应用程序中安装了 Burzum 的 CakePHP 文件存储插件,并附带了 Amazon AWS PHP SDK。现在我的所有 515 单元测试都失败并显示以下消息:

$ php vendor/bin/phpunit --filter testGenerateWithOnlyUppercase
PHPUnit 5.7.0 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 273 ms, Memory: 26.25MB

There was 1 error:

1) App\Test\TestCase\Auth\DefaultPasswordGeneratorTest::testGenerateWithOnlyUppercase
RuntimeException: Instances of Aws\S3\S3Client cannot be serialized

/var/www/html/MyProject/vendor/aws/aws-sdk-php/src/AwsClient.php:230

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

(在上面的示例中,我只运行了一个测试,但每次测试都失败了,无论我是否使用 PHPUnit --filter,每次都出现相同的错误)

CakePHP 版本是 3.4.7,PHPUnit 版本是 5.7.0。老实说,我不知道为什么 PHPUnit 每次测试都进入 AWS sdk,以及为什么它会这样失败。任何指针将不胜感激。

更新:

按照 ndm 的提示,我将 echo \Cake\Error\Debugger::trace(); 放在 AwsClient.php:230 之前。输出是:

Aws\AwsClient::__sleep() - ROOT/vendor/aws/aws-sdk-php/src/AwsClient.php, line 230
serialize - [internal], line ??
SebastianBergmann\GlobalState\Snapshot::snapshotGlobals() - ROOT/vendor/sebastian/global-state/src/Snapshot.php, line 313
SebastianBergmann\GlobalState\Snapshot::__construct() - ROOT/vendor/sebastian/global-state/src/Snapshot.php, line 121
PHPUnit_Framework_TestCase::createGlobalStateSnapshot() - ROOT/vendor/phpunit/phpunit/src/Framework/TestCase.php, line 2488
PHPUnit_Framework_TestCase::snapshotGlobalState() - ROOT/vendor/phpunit/phpunit/src/Framework/TestCase.php, line 2407
PHPUnit_Framework_TestCase::runBare() - ROOT/vendor/phpunit/phpunit/src/Framework/TestCase.php, line 928
PHPUnit_Framework_TestResult::run() - ROOT/vendor/phpunit/phpunit/src/Framework/TestResult.php, line 701
PHPUnit_Framework_TestCase::run() - ROOT/vendor/phpunit/phpunit/src/Framework/TestCase.php, line 909
PHPUnit_Framework_TestSuite::run() - ROOT/vendor/phpunit/phpunit/src/Framework/TestSuite.php, line 728
PHPUnit_Framework_TestSuite::run() - ROOT/vendor/phpunit/phpunit/src/Framework/TestSuite.php, line 728
PHPUnit_Framework_TestSuite::run() - ROOT/vendor/phpunit/phpunit/src/Framework/TestSuite.php, line 728
PHPUnit_TextUI_TestRunner::doRun() - ROOT/vendor/phpunit/phpunit/src/TextUI/TestRunner.php, line 487
PHPUnit_TextUI_Command::run() - ROOT/vendor/phpunit/phpunit/src/TextUI/Command.php, line 188
PHPUnit_TextUI_Command::main() - ROOT/vendor/phpunit/phpunit/src/TextUI/Command.php, line 118
[main] - ROOT/vendor/phpunit/phpunit/phpunit, line 52

【问题讨论】:

  • 每当收到错误时,请始终发布complete错误,即包括full堆栈跟踪 (最好从日志中以正确可读的方式复制),即使问题对于熟悉 CakePHP 的人来说可能很明显!还理想地显示/描述正确的上下文,即显示/突出显示实际触发错误的代码。
  • 谢谢。不幸的是,没有更多,但我用 PHPUnit 的完整输出编辑了我的帖子。我不知道实际触发错误的代码是什么。
  • 我想我以前也遇到过类似的问题,但我不记得它解决了什么问题。但是,问题很清楚:某些东西(这就是您需要弄清楚的部分)正在尝试序列化不可序列化的对象的实例。我建议您以任何方式模拟适配器或在测试中模拟与存储相关的方法。
  • 您好,Burzum 先生!奇怪的是,这个错误出现在我所有的单元测试中,即使是那些根本不接触亚马逊或任何文件存储的单元测试。我一定缺少一些基本的东西。
  • 如果你没有得到堆栈跟踪(甚至在日志中也没有),然后使用像 XDebug 这样的适当调试器并在AwsClient.php:230 上设置和检查断点,或者手动将调试信息添加到代码中,例如从该行之前发出\Cake\Error\Debugger::trace()

标签: php amazon-web-services cakephp amazon-s3 phpunit


【解决方案1】:

原来Aws\S3\S3Client 的一个实例被设置为一个全局变量。 PHPUnit 然后尝试序列化它,但失败了。解决方法是在phpunit.xml配置文件中将backupGlobals设置为false:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit
    colors="true"
    processIsolation="false"
    stopOnFailure="false"
    syntaxCheck="false"
    bootstrap="./tests/bootstrap.php"
    backupGlobals="false"
    >
    <php>
        <ini name="memory_limit" value="-1"/>
        <ini name="apc.enable_cli" value="1"/>
    </php>

    <!-- Add any additional test suites you want to run here -->
    <testsuites>
        <testsuite name="Unit">
...

感谢 ndm 和 burzum 为我指明了正确的方向。

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多