@HellWalk

Оптимальный способ подгрузки фикстур в Symfony + phpunit + codeception?

Вариант подгрузки фикстур из документации симфони следующий:

php bin/console doctrine:fixtures:load


Но выполнять эту команду каждый раз, перед выполнением тестов - такое себе.

Можно подгрузить фикстуры в самом тесте:

$fixtures = new ProductFixtures();
$fixtures->load($this->entityManager);


И запихнуть это куда-нибудь... в setUp().

Но, и такой вариант мне кажется не наилучшим. Нет более оптимального способа?

Например как-нибудь через аннотации:

/**
     * @fixture ProductFixture
     * @dataProvider invalidDateProvider
     * @param string $dateFrom
     * @param string $dateTo
     * @throws ApiException
     */
    public function testInvalidDate(string $dateFrom, string $dateTo): void


?
  • Вопрос задан
  • 1768 просмотров
Пригласить эксперта
Ответы на вопрос 2
@dzhebrak
Через аннотации будет не лучшим вариантом, потому что нужно передавать или ObjectManager, или Client, с помощью которого потом получать необходимые объекты.

Можно сделать trait, который затем использовать в классе теста.

declare(strict_types=1);

namespace App\Tests\Common;

use Doctrine\Common\DataFixtures\Executor\ORMExecutor;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\DataFixtures\Loader;
use Symfony\Bundle\FrameworkBundle\Client;

trait LoadFixturesTrait
{
    public static function loadFixtures(Client $client, array $fixtures, bool $append=false)
    {
        $fixturesLoader = $client->getContainer()->get(Loader::class);
        $fixturesExecutor = $client->getContainer()->get(ORMExecutor::class);

        foreach ($fixtures as $fixture) {
            $fixturesLoader->addFixture(
                $client->getContainer()->get($fixture)
            );
        }

        $fixturesExecutor->execute($fixturesLoader->getFixtures(), $append);
    }
}

И в классе теста:
use LoadFixturesTrait;
...
protected function setUp()
{
	SomeTest::loadFixtures(static::createClient(), [ProductsFixture::class]);
}

В массиве передается список фикстур, которые нужно применить.

В случае, если в методе теста используется экземпляр класса Symfony\Bundle\FrameworkBundle\Client, то именно этот объект нужно передавать в вышеуказанный метод.
Ответ написан
@bkosun
Можно использовать Makefile, чтобы автоматизировать рабочий процесс

Makefile:
SHELL := /bin/bash

tests:
	symfony console doctrine:fixtures:load -n
	symfony php bin/phpunit
.PHONY: tests


https://github.com/the-fast-track/book-5.0-4/blob/...

Чтобы сбрасывать базу данных после каждого теста, используйте DoctrineTestBundle:

$ symfony composer require dama/doctrine-test-bundle --dev


phpunit.xml
...
    <extensions>
        <extension class="DAMA\DoctrineTestBundle\PHPUnit\PHPUnitExtension" />
    </extensions>
...


https://github.com/the-fast-track/book-5.0-4/blob/...

Каждый раз, когда Вы хотите выполнить тесты, используйте команду make tests:

$ make tests

https://symfony.com/doc/current/the-fast-track/ru/...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы