2

Symfony と Doctrine を使用してプロジェクトを開発していますが、テストに問題があります。私は Fixtures を使用してテスト用のデータをロードしていますが、いくつかのエンティティはそれらの間に関連付けられています。空の DB テーブルで初めてテストを実行すると、テストは問題なく成功します。しかし、もう一度テストを実行すると、エラーが発生しました。

Doctrine\DBAL\DBALException: 'DELETE FROM Ent' の実行中に例外が発生しました:

SQLSTATE[23000]: 整合性制約違反: 1451 親行を削除または更新できません: 外部キー制約が失敗しました ( my_db. Ent, CONSTRAINT FK_FE5D1D1E727ACA70FOREIGN KEY ( parent_id) REFERENCES Ent( id))

エラーの理由は明らかです。別の行が外部キーを介して参照している場合、その行を削除できません。

最初に外部キー制約を無効にしてテーブルを手動で切り捨て、空のテーブルでテストを再度実行すると、テストは再び成功します。しかし、テストを実行するたびにこれを繰り返さなければなりません。

問題は、Symfony または PHPUnit にこれを自動的に処理させる方法はあるのでしょうか?

ありがとう!

編集: Liip\FunctionalTestBundle\Test\WebTestCase クラスを使用していることを忘れていました。

4

2 に答える 2

3

Nextar の提案に従って、WebTestCase を拡張することになりました。ありがとう!

これはコードです:

<?php

namespace Acme\MyBundle\Tests\Controller;

use Liip\FunctionalTestBundle\Test\WebTestCase;

class MyWebTestCase extends WebTestCase {

  protected function loadFixtures(array $classNames, $omName = null, $registryName = 'doctrine', $purgeMode = null) {
    $this->getContainer()->get('doctrine')->getManager()->getConnection()->query(sprintf('SET FOREIGN_KEY_CHECKS=0'));
    $result = parent::loadFixtures($classNames, $omName, $registryName, $purgeMode);
    $this->getContainer()->get('doctrine')->getManager()->getConnection()->query(sprintf('SET FOREIGN_KEY_CHECKS=1'));
    return $result;
  }
}
于 2014-07-10T20:09:49.087 に答える
1

これを行う方法があります。Symfony が提供するものを拡張する独自の WebTestCase を作成する必要があります。

Symfony\Bundle\FrameworkBundle\Test\WebTestCase

独自の WebTestCase の loadFixtures メソッドで、コマンド コンポーネントを使用して次のことを行うだけです。

  • データベースをドロップする
  • スキーマを作成する
  • フィクスチャをロードする

忘れないで !コマンドを実行する場合、 --env を test として定義します。そうしないと、prod データベースが削除されます

次に、実行するすべての機能テストで、データベース全体が再構築され、すべてのフィクスチャがロードされます

于 2014-07-02T12:35:56.913 に答える