2013-06-13 5 views
19

My DoctrineFixturesBundle è installato e posso caricare l'apparecchio tramite la riga di comando ma, come posso caricare gli apparecchi dal mio test funzionale?Come caricare gli apparecchi dal test funzionale in Symfony 2

+0

ha la mia risposta risolvere la tua domanda? caricare i dispositivi nel metodo setUp() come nella domanda a cui ho accennato o utilizzare LiipFunctionalTestBundle. – nifr

+0

@nifr Grazie alle mie esigenze, ho usato la soluzione nella domanda che hai accennato ... Prenderò in considerazione i vantaggi del LiipFunctionalTestBundle ... – Ousmane

risposta

14

È possibile caricare i dispositivi nel metodo setUp() del test, come si può vedere in this question.

È possibile utilizzare il codice nella domanda, ma è necessario aggiungere --append al comando doctrine:fixtures:load per evitare la conferma da parte del pacchetto di fixture.

La soluzione migliore è dare uno sguardo allo LiipFunctionalTestBundle che rende più semplice l'utilizzo delle fixture dei dati.

16

Se si utilizza symfony WebTestCase, c'è in realtà un modo molto semplice per caricare i dispositivi. L'apparecchio deve implementare lo FixtureInterface; pertanto, è possibile chiamare il metodo load() direttamente nel metodo setUp() del test. Non vi resta che passare un EntityManager al metodo load(), che può essere aquired dal contenitore symfony:

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

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

Manca tutto il roba ReferenceRepository - addRef/getRef –

3

volevo solo offrire un approccio leggermente più ordinato, se si desidera eliminare prima la vostra tabella di dati di test precedenti, per esempio se stai eseguendo i tuoi test in 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(); 
} 

Questo permette infissi da caricare, (si può spingere di più al metodo apparecchio aggiuntivo), ed eliminare le tabelle prima di essere caricati. Nota anche MongoDB ha la stessa opzione usando MongoDBPurger e MongoDBExecutor. Spero che sia di aiuto a qualcuno

+1

Ciao, sto cercando di usa il tuo approccio, ma '$ executor' intento a cancellare l'intero database e non solo le tabelle correlate, perché questo comportamento? Qualche esempio su come eliminare i dati generati durante il caricamento delle fixture? – ReynierPM

1

Come già accennato, si consiglia di utilizzare il LiipFunctionalTestBundle. Quindi si desidera estendere il proprio WebTestCase dal Liip \ FunctionalTestBundle \ Test \ WebTestCase. Ciò consentirà di chiamare $this->loadFixtures() che accetta come argomento una serie di proiettori.

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

Per maggiori dettagli ho scritto una breve blogpost: http://marcjuch.li/blog/2014/04/06/symfony2-rest-functional-testing-with-fixtures/