如何在Symfony 4中为测试环境设置数据库

5

我对在Symfony 4中为测试环境设置数据库感到困惑。在Symfony 3及以下版本中,我过去会在config_test.yml文件中处理它。

最佳实践是什么?我应该在config/packages/test中重新创建一个doctrine.yaml文件吗?

文档提到了如何通过编辑phpunit配置来使用数据库运行功能测试:

<phpunit>
    <php>
        <!-- the value is the Doctrine connection string in DSN format -->
        <env name="DATABASE_URL" value="mysql://USERNAME:PASSWORD@127.0.0.1/DB_NAME" />
    </php>
    <!-- ... -->
</phpunit>

然而,这并不符合我的需求,因为我需要能够更新模式/加载测试环境的固定装置。


此外,这个答案:https://dev59.com/OqTja4cB1Zd3GeqPFKd1#45889375 可以帮助你。 - yceruto
1个回答

9

针对您想要做的事情,我通常会创建一个自定义测试引导程序,运行所需的Doctrine命令,大致如下:

# 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 name="DATABASE_URL" value="sqlite:///%kernel.project_dir%/var/test.db"/>
<env name="BOOTSTRAP_RESET_DATABASE" value="1" />

如果您想查看一个基本示例,我有一个Symfony 4演示项目,使用它来设置一个基本的测试数据库,该数据库由使用Web测试用例的功能测试使用。您可以在GitHub上找到它:dbrumann/product-api


我尝试过类似的事情,但似乎通过passthru运行的控制台命令并没有在phpunit.xml中定义的<env ...环境中运行... - olidem
1
存在一个值使用的层次结构,因此您的项目的.env.test(.local)文件或系统环境可能会覆盖phpunit.xml.dist中的设置。 - dbrumann
啊,我刚刚发现在测试套件中定义<env...命令是不可能的,而我一直在尝试这样做。无论如何还是谢谢! - olidem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接