Загрузка данных в setUpBeforeClass с помощью LiipFunctionalTestBundle

Как видно из заголовка, я хотел бы знать, как загрузить данные в метод setUpBeforeClass, Тестовый класс расширяется Liip\FunctionalTestBundle\Test\WebTestCase,

На данный момент у меня есть это:

public function setUp()
{
    $this->client = $this->createClient();
    $this->fixtures = $this->loadFixtures([
        'App\DataFixtures\MyFixtures',
        // more fixtures
    ])->getReferenceRepository();
}

Однако, похоже, что испытания занимают слишком много времени, и нет необходимости загружать приборы перед каждым испытанием.

Когда я пытался загрузить приборы в setUpBeforeClass У меня есть ошибка:

Ошибка: использование $this, когда не в контексте объекта в /home/cezar/phpprojects/livegene/vendor/liip/functional-test-bundle/src/Test/WebTestCase.php:252

Просмотр исходного кода LiipFunctionalTestBundle показал этот фрагмент:

protected function loadFixtures(array $classNames = [], bool $append = false, ?string $omName = null, string $registryName = 'doctrine', ?int $purgeMode = null): ?AbstractExecutor
{
    $container = $this->getContainer();

    $dbToolCollection = $container->get('liip_functional_test.services.database_tool_collection');
    $dbTool = $dbToolCollection->get($omName, $registryName, $purgeMode, $this);
    $dbTool->setExcludedDoctrineTables($this->excludedDoctrineTables);

    return $dbTool->loadFixtures($classNames, $append);
}

Можно ли сделать это, что я хочу, и если да, как это может быть достигнуто?

1 ответ

Если все, что вам нужно, это работающий EntityManager с (частично) допустимой схемой базы данных для запроса, вы можете использовать DoctrineTestHelper, предоставляемый Symfony DoctrineBridge:

public static function setUpBeforeClass()
{
    $config = DoctrineTestHelper::createTestConfiguration();
    $config->setNamingStrategy(new UnderscoreNamingStrategy());
    $entityManager = DoctrineTestHelper::createTestEntityManager($config);
    $schemaTool = new SchemaTool($entityManager);
    $schemaTool->createSchema([
        // List of entities to create schema for
        $entityManager->getClassMetadata(User::class),
        $entityManager->getClassMetadata(Task::class),
    ]);
    static::$entityManager = $entityManager;
}

По умолчанию это будет использовать SQLite3 в памяти для подключения, но вы также можете указать его для любой другой базы данных, используя конфигурацию и соответствующие драйверы. Также будьте внимательны при регистрации любых пользовательских типов DBAL и прослушивателей LifecycleEvent, так как это изменит способ обработки данных и работает ли сопоставление с вашими сущностями.

Теперь в ваших тестах вы можете использовать static::$entityManager как всегда с таблицами или вставьте тестовые приборы, как вы считаете нужным.

Другие вопросы по тегам