2013-06-13 2 views
19

My DoctrineFixturesBundle установлен, и я могу загрузить устройство через командную строку, но как я могу загрузить светильники из своего функционального теста?Как я могу загрузить светильники из функционального теста в Symfony 2

+0

сделал мой ответ разрешить ваш вопрос? либо загрузите приборы в методе setUp(), как в вопросе, который я намекнул или использовал LiipFunctionalTestBundle. – nifr

+0

@nifr Спасибо, что он соответствует моим потребностям, я использовал решение в вопросе, который вы намекали ... Я рассмотрю преимущества LiipFunctionalTestBundle ... – Ousmane

ответ

14

Вы можете загрузить приборы в свой метод теста setUp(), как вы можете видеть в this question.

Вы можете использовать код в вопросе, но при этом необходимо добавить --append в команду doctrine:fixtures:load, чтобы избежать подтверждения с помощью комплекта светильников.

Лучшее решение - это посмотреть на LiipFunctionalTestBundle, который упрощает использование приборов для сбора данных.

16

Если вы используете Symfony WebTestCase, на самом деле есть очень простой способ загрузить ваши светильники. Ваш прибор должен реализовать FixtureInterface; Таким образом, вы можете вызвать метод load() непосредственно в методе теста setUp(). Вы просто должны пройти EntityManager к load() методу, который может быть приобретенным из контейнера симфони:

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); 

Для получения более подробной информации я написал короткий BlogPost: http://marcjuch.li/blog/2014/04/06/symfony2-rest-functional-testing-with-fixtures/