phpunit/zend_test:pdoexception:PDOインスタンスをシリアル化または非表示にすることはできません

StackOverflow https://stackoverflow.com/questions/4471802

質問

私は例外を取得しています

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

http://pastebin.com/bs79xvim

他のヒント

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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top