PHPUnit RuntimeException:无法序列化 Aws\S3\S3Client 的实例



在我的 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) AppTestTestCaseAuthDefaultPasswordGeneratorTest::testGenerateWithOnlyUppercase
RuntimeException: Instances of AwsS3S3Client 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 CakeErrorDebugger::trace();放在AwsClient.php:230之前。输出为:

AwsAwsClient::__sleep() - ROOT/vendor/aws/aws-sdk-php/src/AwsClient.php, line 230
serialize - [internal], line ??
SebastianBergmannGlobalStateSnapshot::snapshotGlobals() - ROOT/vendor/sebastian/global-state/src/Snapshot.php, line 313
SebastianBergmannGlobalStateSnapshot::__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

事实证明,AwsS3S3Client的实例被设置为全局变量。然后 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大喊大叫,他们为我指明了正确的方向。

最新更新