【发布时间】: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