2013-06-13 23 views
19

My DoctrineFixturesBundle jest zainstalowany i mogę wczytać urządzenie przez linię poleceń, ale jak mogę załadować urządzenia z mojego testu funkcjonalnego?Jak mogę załadować urządzenia z testu funkcjonalnego w Symfony 2

+0

nie moja odpowiedź rozwiązać swoje pytanie? albo wczytaj urządzenia w metodzie setUp(), jak w pytaniu, które zasugerowałem lub użyj LiipFunctionalTestBundle. – nifr

+0

@nifr Dzięki temu, że pasuję do moich potrzeb, użyłem rozwiązania w pytaniu, które napomknąłeś ... Rozważę zalety LiipFunctionalTestBundle ... – Ousmane

Odpowiedz

14

Możesz załadować urządzenia w swojej metodzie testu setUp(), jak widać w this question.

Możesz użyć kodu w pytaniu, ale musisz dołączyć --append do komendy doctrine:fixtures:load, aby uniknąć potwierdzenia przez pakiet urządzeń.

Lepszym rozwiązaniem jest zapoznanie się z LiipFunctionalTestBundle, dzięki czemu korzystanie z urządzeń do transmisji danych jest łatwiejsze.

16

Jeśli używasz Symfony WebTestCase, istnieje bardzo łatwy sposób na załadowanie urządzeń. Twoja oprawa musi zaimplementować FixtureInterface; w ten sposób można ją nazwać metodą load() bezpośrednio w metodzie testu setUp(). Po prostu trzeba zdać EntityManager metody load(), które mogą być nabyte z pojemnika symfony:

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

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

Tęskni za wszystkimi rzeczami ReferenceRepository - addRef/getRef –

3

Chciałem zaoferować nieco schludniejszy podejście, jeśli chcesz, aby najpierw oczyścić tabelę z poprzednich danych testowych, na przykład jeśli używasz swoich testów w 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(); 
} 

Pozwala Oprawy mają być załadowane, (można wcisnąć bardziej do metody oprawy ADD), i oczyścić tabele, zanim zostaną one załadowane. Należy również zauważyć, że MongoDB ma tę samą opcję przy użyciu MongoDBPurger i MongoDBExecutor. Mam nadzieję, że komuś pomogło

+1

Witam, próbuję użyj swojego podejścia, ale '$ executor' zamierza usunąć całą bazę danych, a nie tylko powiązane tabele, dlaczego to zachowanie? Dowolny przykład, jak oczyścić wygenerowane dane podczas ładowania urządzeń? – ReynierPM

1

Jak już wspomniano, zaleca się użycie LiipFunctionalTestBundle. Następnie należy rozszerzyć WebTestCase z Liip \ FunctionalTestBundle \ Test \ WebTestCase. Umożliwi to wywołanie $this->loadFixtures(), która przyjmuje jako argument tablicę urządzeń.

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

Więcej szczegółów Napisałem krótki blogpost: http://marcjuch.li/blog/2014/04/06/symfony2-rest-functional-testing-with-fixtures/