2017-01-22 10 views
0

私はDoctrine Data Fixturesの問題に直面しています。受諾テストを実行するためにフィクスチャを使用してデータを挿入すると、特定のエンティティが永続化されていることをどうにか特定のIDで保持できますか?データフィクスチャでエンティティIDを管理する

たとえば、いくつかのサンプルユーザーを作成してから、ユーザーの1人を編集して受け入れテストを実行します。このテストケースのユーザーIDを知る必要があります。 これを処理するベストプラクティスは何ですか? フィクスチャによって作成されたいくつかのエンティティのIDをハードコードすることはできますか?または、生成されたIDを別のテーブル、ファイルなどに格納して、要求されたエンティティを見つける必要がありますか?または他のベストプラクティスがありますか?

ありがとうございます。

+0

あなたはsymfonyであなたの質問にタグを付けるが、ここを読んでいない:https://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html#sharing-objects-between-fixturesはあなたにいくつかを与えるかもしれませんアイデア。 – Cerad

+0

私はSymfonyで動作しないので、私はしませんでした:)私はDoctrineをNetteフレームワークにも使用します。しかし、私は最終的にこのSymfonyのアプローチに終わったので、ありがとう:) – amik

答えて

4

私たちのアプリケーションでは、これらのフィクスチャの静的プロパティにエンティティを設定しているため、テストから簡単に使用できます。

class CategoryTestFixture 
    extends \Doctrine\Common\DataFixtures\AbstractFixture 
    implements 
     \Doctrine\Common\DataFixtures\OrderedFixtureInterface, 
     \Symfony\Component\DependencyInjection\ContainerAwareInterface 
{ 

    /** @var \My\Category */ 
    public static $fooCategory; 

    /** @var \My\Category */ 
    public static $barCategory; 

    /** @var \Symfony\Component\DependencyInjection\ContainerInterface */ 
    private $container; 

    public function load(ObjectManager $manager) 
    { 
     self::$fooCategory = new Category('Foo'); 
     $entityManager->persist(self::$fooCategory); 

     self::$barCategory = new Category('Bar'); 
     $entityManager->persist(self::$barCategory); 

     $entityManager->flush(); 
    } 

    // you can inject the container, 
    // so you can use your Facades in fixtures 

    public function getContainer(): ContainerInterface 
    { 
     return $this->container; 
    } 

    public function setContainer(ContainerInterface $container = null) 
    { 
     $this->container = $container; 
    } 

} 

これにはいくつかの重要なルールがあります。

  • はあなたの備品で$em->clear()を呼び出すことはありませんので、あなたが直接、他の備品クラス内のエンティティを使用できることを確認します。
  • フィクスチャがロードされると$em->clear()にコールしてください。テストには影響しません。
  • すべてのテストの前に、準備されたデータベースのコピーを作成し、そのコピーを "テンプレートデータベース"ではなくテスト用に使用してください。したがって、データを安全に変更することができます。さらに最適化することができますが、これは最も簡単な解決策です。
  • あなたのテストで元の治具を管理していたとして登録しないでください。

は、今では備品が作成していることを、あなたはすべてのそれらのプロパティだけではないIDを参照することができ、また、この

$id = CategoryTestFixture::$barCategory->getId(); 

のようにそれらを使用します。ですから、あなたのAPIが正しいカテゴリを返すと主張したければ、このようにすることができます。

$this->assertArraySubset([ 
    [ 
     'id' => CategoryTestFixture::$fooCategory->getId(), 
     'name' => CategoryTestFixture::$fooCategory->getName(), 
    ], 
    [ 
     'id' => CategoryTestFixture::$barCategory->getId(), 
     'name' => CategoryTestFixture::$barCategory->getName(), 
    ] 
], $apiResponseData); 

、あなたはaftewards、ただ一つのテストケースのデータを修正するデータベースを変更するための固定具のプロパティを使用して、明確なEMたいので、あなたはすでに人口のアイデンティティマップと副作用を作成しない場合エンティティマネージャ

$barCategory = $entityManager->find(
    Category::class, 
    CategoryTestFixture::$barCategory->getId() 
); 

$barCategory->setName('Another name'); 

$entityManager->flush(); 
$entityManager->clear(); 
+0

興味深いアイデアですが、私はこれがSymfonyのリファレンスアプローチよりも優れているかどうかはわかりません。私はEMがどのように役立つのか、また既にエンティティをロードしてDoctrineによって適切にマッピングされるべきではないので、参照から変更した場合、他のすべての参照(参照変数)エンティティ? – amik

関連する問題