Codeception和Symfony - 在测试之前运行Doctrine迁移

Chr*_*own 8 php symfony doctrine-orm codeception

我有一个Symfony 4应用程序和Doctrine with Doctrine迁移.我正在介绍用于运行API测试的Codeception,并且需要在测试运行之前运行迁移.由于我使用的是Doctrine2模块,因此我不想包括DB模块,因为测试不需要它,并且需要在两个不同的位置配置测试数据库.

我目前正在使用Symfony模块,我注意到Laravel模块有一个run_database_migrations配置选项.

在测试之前处理在Symfony应用程序中运行Doctrine迁移命令的最佳方法是什么?(bin/console doctrine:migrations:migrate -n是具体的命令).


编辑我已经找到了一个解决方案,虽然它有效,但远非理想.通过使用Codeception Customization,我创建了以下扩展,基本上手动exec执行基础Symfony命令.

class DatabaseMigrationExtension extends Extension
{
    public static $events = [
        Events::SUITE_BEFORE => 'beforeSuite',
    ];

    public function beforeSuite(SuiteEvent $e)
    {
        echo(exec('bin/console doctrine:database:drop --force') . PHP_EOL);
        echo(exec('bin/console doctrine:database:create') . PHP_EOL);
        echo(exec('bin/console doctrine:migrations:migrate -n') . PHP_EOL);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑2这个目标基本上是复制类似于Codeception DB模块的功能,它允许您提供它在测试中自动使用的数据库的SQL转储,而是使用Doctrine迁移来处理数据库.- https://codeception.com/docs/modules/Db#sql-data-dump

Chr*_*own 7

我花了一段时间尝试了几种不同的方法来实现这一目标。我最初使用RunProcess但是这似乎导致数据库被删除而不是重新创建的偶发问题,尽管使用了睡眠配置。我最终只是更新了现有的扩展以使用 CLI 模块,它可以按需要工作(无需创建脚本或运行多个命令),也无需使用exec.

最终延期;

class DatabaseMigrationExtension extends Extension
{
    public static $events = [
        Events::SUITE_BEFORE => 'beforeSuite',
    ];

    public function beforeSuite()
    {
        try {
            /** @var \Codeception\Module\Cli $cli */
            $cli = $this->getModule('Cli');

            $this->writeln('Recreating the DB...');
            $cli->runShellCommand('bin/console doctrine:database:drop --if-exists --force');
            $cli->seeResultCodeIs(0);
            $cli->runShellCommand('bin/console doctrine:database:create');
            $cli->seeResultCodeIs(0);

            $this->writeln('Running Doctrine Migrations...');
            $cli->runShellCommand('bin/console doctrine:migrations:migrate --no-interaction');
            $cli->seeResultCodeIs(0);

            $this->writeln('Test database recreated');
        } catch (\Exception $e) {
            $this->writeln(
                sprintf(
                    'An error occurred whilst rebuilding the test database: %s',
                    $e->getMessage()
                )
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并注册;

// codeception.yml
extensions:
    enabled:
        - \DatabaseMigrationExtension
Run Code Online (Sandbox Code Playgroud)

输出(-vv或更高版本还显示 DB & Migration 命令的输出);