1

Doctrine 2 ORM で PHPUnit テストをセットアップしようとしています。しかし、奇妙な問題が発生していますが、これはある種のキャッシング (Doctrine 側) に起因しているとしか思えません。これを克服する方法がわかりません。これは私が持っているものです:

セットアップ機能:

public function setUp() 
{
    $front = Zend_Controller_Front::getInstance();
    $bootstrap = $front->getParam("bootstrap");

    if(!$boostrap) {
        $application = Zend_Registry::get("application");
        $bootstrap = $application->getBootstrap();
    }
    $bootstrap->bootstrap('doctrine');

    $this->em   = $bootstrap->getResource('doctrine');
    $tool       = new \Doctrine\ORM\Tools\SchemaTool($this->em);
    $classes    = $this->em->getMetaDataFactory()->getAllMetaData();

    $tool->dropSchema($classes);
    $tool->createSchema($classes);

    parent::setUp();
}

これは基本的に、すべてのテストの教義インスタンスをリセットすることを目的としています。現時点では、図のようにスキーマをリセットするため、tearDown() 関数はありません。ここで、私は SQLite を使用していることに言及する必要があります。

実行しようとしている 1 つのクラスに、依存関係のない 2 つのテストがあります。最初のテストでは、次のようにレコードを挿入します。

$value = 5;
$model = new Model();
$model->setUserId($rater->getId());
$model->setValue($value);

$this->em->persist($model);
$this->em->flush();

ここまでは順調ですね。データベースに値が 5 の新しいレコードがあります。

次のテストへ。今回は実行したい:

$value = 3;
$model = new Model();
$model->setUserId($rater->getId());
$model->setValue($value);

$this->em->persist($model);
$this->em->flush();

関連するテーブルからすべてのレコードをダンプすると、1 つの結果が得られます。再び 5 の値を持つレコード。つまり、2 番目のテストは最初のテストから $value を取得しています。2 番目のテストの開始時にすべてのレコードをダンプして再確認しましたが、何も返されません。Doctrine のどこかに、私が気付いていないキャッシングの問題があるようです。

Doctrine が確認できる可能性があることを認識しているさまざまなキャッシュをクリアしようとしました。

$cacheDriver = new \Doctrine\Common\Cache\XcacheCache();
$cacheDriver->deleteAll();

私が試すことができる他の何かを誰かが提案できますか? または、私がDoctrineを実装した方法のどこかに誤ったコードがありますか?

ありがとう

4

1 に答える 1

2

そのため、どこで何が問題だったのかは完全にはわかりませんが、Doctrine がどこかでキャッシュしていたに違いないようです。結局のところ、オブジェクトが永続化後、フラッシュ前に正しい値を持っていることを確認しました。フラッシュ後、突然予想とは異なる値になりました。

とにかく、問題を修正するために、次の行を追加しました。

$this->em->clear();

Bootstrap から教義リソースを取得した直後。これにより、スキーマを削除して再作成する前に、すべての管理対象エンティティがエンティティ マネージャから完全に消去されます。

于 2012-08-07T14:08:19.567 に答える