phpunit/zend_test:pdoexception:PDOインスタンスをシリアル化または非表示にすることはできません
-
11-10-2019 - |
質問
私は例外を取得しています
PDOException: You cannot serialize or unserialize PDO instances
単体テストにphpunitを使用しようとしているとき。あまり起こっていません。 Zend Framework 1.11を使用しています。 Zend_Registryにエンティティマネージャーを保存しているアプリケーションをブートストラップしたと思いますか?
// application/Bootstrap.php -> _initDoctrine()
$em = EntityManager::create($doctrineOptions['connectionOptions'], $config);
Zend_Registry::set("em", $em);
私のユニットテストでは、それはように見えます
class Application_Models_UserTest extends Zend_Test_PHPUnit_ControllerTestCase
public function testUnitTest() {
$this->assertTrue(true);
}
}
私のphpunit.xmlはどのように見えますか http://pastebin.com/bcv2ci8r, 、懸念の主な領域は1行目だと思うので、bootstrap.phpは次のように見えます http://pastebin.com/hvzhjag1
アップデート
ラインがあるときに問題が始まることがわかりました
$schemaTool->dropSchema($classes);
$schemaTool->updateSchema($classes);
bootstrap.phpで http://pastebin.com/hvzhjag1
解決 3
それはいつかでしたが、私はの使用を削除することで問題を修正したと思います Zend_Registry
から bootstrap.php
他のヒント
Phpunitバックアップグローバル。 PDOが$ Globalsまたは$ Globalsにあるオブジェクト内のどこかにある場合、この問題が発生します。
以前にこの問題が発見されましたが、Webを検索した後、1つのソリューションを入手した後 http://www.phpunit.de/ticket/376. 。設定するだけです backupGlobals
偽りに protected $backupGlobals = TRUE;
phpunit/frameword/testcase.phpで。
しかし、PHPunit開発者チームはそれを提唱していません。PHPunitのユーザーの大半は、$ Globals機能のバックアップが有効になったときと同じように機能すると予想しています。これがデフォルトで有効になっている理由です。
テストが$ Globalsに入力されていないオブジェクトを$ Globalsに入れるテストを行うと、機能を無効にすることができます。ソフトウェア設計の観点からは、最初からPDOのグローバルなインスタンスを持ってはいけません。
だから、私はこれを使用して完璧な解決策を得ました:
$db = SmartPHP_Db::factory($dbConfig);
SmartPHP_Pool::set("db" , $db);
SmartPHP_Db_Table::setDefaultAdapter($db);
単位テストコードの後:
unset($db);