Функциональное тестирование Symfony с несколькими Doctrine EntityManager - PullRequest
0 голосов
/ 06 ноября 2018

В приложении Symfony 4 я настроил несколько менеджеров сущностей. Я хочу, чтобы мои функциональные тесты автоматически создавали таблицы БД для обоих менеджеров.

Однако, когда я запускаю тест; PHP-модуль сталкивается с ошибкой, которая говорит

PDOException: SQLSTATE [42S02]: базовая таблица или представление не найдено: 1146 Таблица 'test.example' не существует

конфиг / пакеты / doctrine.yaml:

doctrine:
    dbal:
        connections:
            default:
                url: '%env(resolve:DATABASE_URL)%'
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
            custom:
                url: '%env(resolve:DATABASE_URL)%'
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4

    orm:
        default_entity_manager: default
        auto_generate_proxy_classes: '%kernel.debug%'
        entity_managers:
            default:
                connection: default
                naming_strategy: doctrine.orm.naming_strategy.underscore
                auto_mapping: true
                mappings:
                    Model:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Model'
                        prefix: 'App\Entity\Model'
                        alias: Model
            custom:
                connection: custom
                naming_strategy: doctrine.orm.naming_strategy.underscore
                mappings:
                    Custom:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Custom'
                        prefix: 'App\Entity\Custom'
                        alias: Custom

Для создания таблиц и загрузки приборов в настоящее время я использую Liip Functional Test Bundle .

Простой тест выглядит так:

Тесты \ Functional \ GeneralControllerTest.php:

class GeneralControllerTest extends WebTestCase
{
    /**
     * {@inheritdoc}
     */
    protected function setUp()
    {
        $this->loadFixtures([
            SomeFixtures::class,
            MoreFixtures::class,
        ]);
    }

    /**
     * @dataProvider providePageUris
     * @test
     * @param string $uri
     */
    public function checkThatPageLoads($uri)
    {
        $client = static::createClient();

        /* ... more code ... */

        $client->request(Request::METHOD_GET, $uri);

        static::assertEquals(Response::HTTP_OK, $client->getResponse()->getStatusCode());
    }

    /**
     * @return array
     */
    public function providePageUris()
    {
        return [
            ["/dashboard"],
        ];
    }
}

Как я могу заставить свой Test Case создавать таблицы базы данных для других пользовательских Doctrine EntityManager?

Я попытался добавить:

$this->loadFixtures([], true, "custom");

, а также:

$this->runCommand("doctrine:schema:create --env=test --em=custom");

к методу setUp () контрольного примера, но это не привело к тому, что необходимо. Все таблицы базы данных должны быть созданы перед загрузкой любого Fixture в базу данных.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Чтобы не было таблиц в другом диспетчере сущностей и не удалялось соединение при загрузке данных, я изменил конфигурацию доктрины с разными переменными среды.

конфиг / пакеты / doctrine.yaml:

doctrine:
    dbal:
        connections:
            default:
                url: '%env(resolve:DATABASE_URL)%'
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
            custom:
                url: '%env(resolve:DATABASE_URL_CUSTOM)%'
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
0 голосов
/ 06 ноября 2018

Согласно коду для WebTestCase на GitHub второй аргумент должен содержать имя менеджера объектов. Я не уверен, достаточно ли указать custom или вам нужно указать полное имя doctrine.entity_manager.custom.

...