Как настроить базу данных для тестовой среды в Symfony 4

Я не понимаю, как настроить базу данных для тестовой среды в symfony 4. Раньше я имел дело с этим в файле config_test.yml в symfony 3 и ниже.

Какая лучшая практика? Должен ли я воссоздать файл doctrine.yaml в config / packages / test?

В документации упоминается, как запустить функциональный тест с использованием базы данных, отредактировав конфигурацию phpunit:

<phpunit>
    <php>
        <!-- the value is the Doctrine connection string in DSN format -->
        <env name = "DATABASE_URL" value = "mysql://USERNAME:[email protected]/DB_NAME" />
    </php>
    <!-- ... -->
</phpunit>

Однако это не соответствует моим потребностям, так как мне нужно иметь возможность обновлять схемы / загружать фикстуры в тестовой среде.

Также этот ответ: stackoverflow.com/a/45889375/4224384 может вам помочь.

yceruto 05.06.2018 14:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
5
1
4 141
1

Ответы 1

Для того, что вы хотите сделать, я обычно создаю собственный тестовый загрузчик, который запускает необходимые команды доктрины и выглядит примерно так:

# tests/bootstrap.php
<?php

if (isset($_ENV['BOOTSTRAP_RESET_DATABASE']) && $_ENV['BOOTSTRAP_RESET_DATABASE'] == true) {
    echo "Resetting test database...";
    passthru(sprintf(
        'php "%s/../bin/console" doctrine:schema:drop --env=test --force --no-interaction',
        __DIR__
    ));
    passthru(sprintf(
        'php "%s/../bin/console" doctrine:schema:update --env=test --force --no-interaction',
        __DIR__
    ));
    passthru(sprintf(
        'php "%s/../bin/console" doctrine:fixtures:load --env=test --no-interaction',
        __DIR__
    ));
    echo " Done" . PHP_EOL . PHP_EOL;
}
require __DIR__.'/../vendor/autoload.php';

В моем phpunit.xml.dist я добавил переменную env:

<env name = "DATABASE_URL" value = "sqlite:///%kernel.project_dir%/var/test.db"/>
<env name = "BOOTSTRAP_RESET_DATABASE" value = "1" />

Если вы хотите увидеть базовый пример, у меня есть демонстрационный проект Symfony 4, который использует его для настройки базовой тестовой базы данных, которая используется функциональными тестами с использованием веб-тестового примера. Вы можете найти его на GitHub: dbrumann / product-api

Я пробовал что-то подобное, но похоже, что консольная команда passthu'ed не запускает среду, определенную моими записями <env ... в phpunit.xml ...

olidem 23.10.2019 09:53

Существует иерархия используемых значений, поэтому возможно, что файл .env.test(.local) вашего проекта или ваша системная среда перезаписывают настройки из phpunit.xml.dist.

dbrumann 23.10.2019 11:39

Ах, нет, я только что обнаружил, что невозможно определить команды <env... в тестовых наборах, и я пробовал это. Спасибо, в любом случае!

olidem 23.10.2019 11:41

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