1

例外が発生しています

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

4

3 に答える 3

3

PHPUnit はグローバルをバックアップします。PDO が $GLOBALS のどこかにある場合、または $GLOBALS にあるオブジェクト内にある場合、この問題が発生します。

于 2010-12-19T21:34:12.537 に答える
2

私は以前にこの問題を見つけました.Webを検索した後、http://www.phpunit.de/ticket/376から1つの解決策を得ました。PHPUnit/Frameword/TestCase.php でbackupGlobalsfalse に設定するだけです。protected $backupGlobals = TRUE;

しかし、PHPUnit 開発者チームはそれを推奨していません。PHPUnit のユーザーの大多数は、$GLOBALS 機能のバックアップが有効になっている場合と同じように機能することを期待しています。これが、デフォルトで有効になっている理由です。

シリアル化できないオブジェクトを $GLOBALS に入れるコードがテストで実行される場合は、この機能を無効にすることができます。ソフトウェア設計の観点からは、最初から PDO のグローバル インスタンスを用意するべきではありません。

だから、私はこれを使って完璧な解決策を得ました:

$db = SmartPHP_Db::factory($dbConfig);
SmartPHP_Pool::set("db" , $db);
SmartPHP_Db_Table::setDefaultAdapter($db);

単体テスト コードの後:

unset($db);
于 2013-08-04T11:49:22.263 に答える
-1

Zend_Registryしばらく経ちましたが、 fromの使用を削除して問題を修正したと思いますbootstrap.php

http://pastebin.com/BS79xviM

于 2010-12-25T08:19:19.360 に答える