2013-06-13 12 views
19

私のDoctrineFixturesBundleがインストールされていて、コマンドラインからフィクスチャをロードできますが、機能テストからフィクスチャをロードするにはどうすればいいですか?Symfony 2の機能テストからフィクスチャを読み込むにはどうすればいいですか

+0

私の答えはあなたの質問を解決しましたか? LiipFunctionalTestBundleを使用するか、使用するかのように、setUp()メソッドでフィクスチャをロードします。 – nifr

+0

@nifr私のニーズに合ってくれてありがとうございました。あなたは思いついた質問で解決策を使用しました...私はLiipFunctionalTestBundleの利点を考えます... – Ousmane

答えて

14

this questionのように、テストのsetUp()メソッドでフィクスチャを読み込むことができます。

fixtures-bundleによる確認を避けるため、質問内のコードを使用することができますが、--appenddoctrine:fixtures:loadコマンドに追加する必要があります。

より良い解決策は、LiipFunctionalTestBundleを見て、データフィクスチャを使いやすくすることです。

16

symfonyのWebTestCaseを使用している場合、実際には非常に簡単に器具をロードすることができます。 フィクスチャーはFixtureInterfaceを実装する必要があります。テストのsetUp()メソッドで直接load()メソッドと呼ぶことができます。あなただけのsymfonyのコンテナから後天することができload()方法にEntityManagerを渡す必要があります:

public function setUp() { 
    $client = static::createClient(); 
    $container = $client->getContainer(); 
    $doctrine = $container->get('doctrine'); 
    $entityManager = $doctrine->getManager(); 

    $fixture = new YourFixture(); 
    $fixture->load($entityManager); 
} 
+0

これは、すべてのReferenceRepositoryのものを逃しています - addRef/getRef –

3

私はちょうどあなたが最初に前回のテストデータのあなたのテーブルを削除したい場合は少しすっきりアプローチを提供したかったです、例えばあなたがphpunitでテストを実行している場合。

use Doctrine\Common\DataFixtures\Purger\ORMPurger; 
use Doctrine\Common\DataFixtures\Executor\ORMExecutor; 
use Doctrine\Common\DataFixtures\Loader; 
use Namespace\FakeBundle\DataFixtures\ORM\YourFixtures; 

public function setUp() 
{ 
    static::$kernel = static::createKernel(); 
    static::$kernel->boot(); 
    $this->em = static::$kernel->getContainer() 
     ->get('doctrine') 
     ->getManager() 
    ; 

    $loader = new Loader(); 
    $loader->addFixture(new YourFixtures); 

    $purger = new ORMPurger($this->em); 
    $executor = new ORMExecutor($this->em, $purger); 
    $executor->execute($loader->getFixtures()); 

    parent::setUp(); 
} 

これは器具をロードすることを可能にする、(あなたが追加器具メソッドにもっとプッシュすることができます)、およびそれらがロードされる前にテーブルをパージします。 MongoDBはMongoDBPurgerとMongoDBExecutorを使用して同じオプションを持っています。 誰かを助けることを願っています

+1

こんにちは、あなたのアプローチを使用しますが、関連するテーブルだけでなくデータベース全体を削除するために '$ executor'を使用します。なぜその動作ですか?什器のロード中に生成されたデータをパージする方法の例は? – ReynierPM

1

すでに言及したように、LiipFunctionalTestBundleを使用することをお勧めします。 次に、WebTestCaseをLiip \ FunctionalTestBundle \ Test \ WebTestCaseから拡張します。これにより、配列の配列を引数として取る$this->loadFixtures()を呼び出すことができます。詳細については

$fixtures = array('Acme\MemeberBundle\DataFixtures\ORM\LoadMemberData'); 
$this->loadFixtures($fixtures); 

私は短いブログ投稿を書きました:http://marcjuch.li/blog/2014/04/06/symfony2-rest-functional-testing-with-fixtures/

関連する問題