6

Doctrine 2 を使用する Zend Framework アプリケーション (バージョン 1.11) があります。モデルやフォームなどでテストを実行するように PHPUnit をセットアップしました。テストはうまく機能しますが、問題が 1 つあります。テストが完了すると、テスト データがデータベースに残ります。以下は、私のテストの 1 つの基本的なサンプルです。

class VisaTypeEntityTest extends ModelTestCase
{
    public function testCanSaveAndRetrieveVisaType()
    {
        $addVisaType = new \Entities\VisaTypes();
        $addVisaType->setEnglishName('Test Visa Type')
            ->setJapaneseName('試し')
            ->setKanaName('タメシ')
            ->setDescription('Description of the test visa type');

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

        $getVisaType = $this->em->getRepository('\Entities\VisaTypes')
            ->findOneByEnglishName('Test Visa Type');

        $this->assertEquals('Test Visa Type', $getVisaType->getEnglishName());
    }
}

明らかに、すべてが適切であることを確認するために、データを実際にデータベースに入力する必要があります。しかし、テストを実行するたびにすべてのテスト データがデータベースを詰まらせたり、手動で削除したりしたくありません。

テストが完了したら、tearDown() メソッドを使用してテスト データを削除するなど、何かできることはありますか? もしそうなら、テーブルの id フィールドの自動インクリメントを以前のものに「ロールバック」することは可能ですか? ID間にギャップがあっても問題ないことはわかっていますが、Doctrineに自動インクリメント値をリセットさせる方法があれば、それは素晴らしいことです.

4

1 に答える 1

8

1.「片付け」について:

InnoDB を使用しているため、トランザクションを使用して DB をテスト開始前と同じ状態に復元できます。

これにより、データベースが以前の状態に復元されますsetUp()また、「 InnoDB トランザクション モデルとロック」に関する MySQL ハンドブックを参照して、これがアプリケーション内の他のデータに干渉しないことを確認してください (キーワード: 分離レベル)。$this->em->getConnection()->beginTransaction();tearDown() $this->em->getConnection()->rollback();

2. 自動インクリメント ID のロールバックについて:

私の知る限り、これは (簡単には) 不可能です。SO にはそれに関するスレッドがあり、自動インクリメント ID 間にギャップがあってもアプリケーションは気にしないでください。テスト データベースを使用している場合 (これを強くお勧めします)、これはそれほど問題ではありません。

于 2013-06-30T09:20:44.840 に答える