2017-07-03 55 views
0

在我的CakePHP應用程序中安裝了Burzum的CakePHP File Storage插件,並在其中安裝了Amazon AWS PHP SDK。現在,我所有的515次單元測試失敗,出現以下消息:PHPUnit RuntimeException:Aws S3 S3Client的實例無法序列化

$ 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 
+1

無論何時出現錯誤,請始終發佈** _complete_錯誤**,即**包括_full_堆棧跟蹤**(理想情況下,以可正常讀取的方式從日誌中複製),即使問題對熟悉CakePHP的人來說可能很明顯!還理想地顯示/描述正確的上下文,即顯示/突出顯示實際觸發錯誤的代碼。 – ndm

+0

謝謝。不幸的是,我用PHPUnit的完整輸出編輯了我的帖子。我不知道什麼代碼實際觸發了錯誤。 –

+0

我想我以前有類似的問題,但我不記得它修復了什麼。然而,問題很明顯:某些東西(即你需要弄清楚的部分)試圖序列化一個不可序列化的對象的實例。我建議您以任何方式模擬適配器,或者在測試中模擬存儲相關的方法。 – burzum

回答

0

事實證明,Aws\S3\S3Client的一個實例被設置爲全局變量。 PHPUnit然後嘗試序列化這個,並失敗。解決的辦法是設置backupGlobals爲false phpunit.xml配置文件中:

<?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的指點我朝着正確的方向發展。

相關問題