如何在Laravel 5中为phpunit指定不同的.env文件?

Gnu*_*fo1 22 php phpunit laravel laravel-5 phpdotenv

我有一个.env包含我的数据库连接详细信息的文件,正如Laravel 5一样.我想覆盖这些用于测试,我可以做phpunit.xml.然而,这样做似乎违背了.env不提交环境配置,特别是密码的哲学.

有没有可能有类似的东西,.env.testing并告诉phpunit.xml从中读取?

Dim*_*sta 15

复制你.env.env.testing,然后编辑.env.testing文件并更改APP_ENV参数使其像APP_ENV=testing这样,这样你就可以在这个新文件中指定你的设置

如果您不想创建新.env.testing文件,您必须phpunit.xml在php部分中使用您需要的值指定变量,如下所示

<php>
    <env name="APP_ENV" value="testing"/>
    <env name="CACHE_DRIVER" value="array"/>
    <env name="SESSION_DRIVER" value="array"/>
    <env name="QUEUE_DRIVER" value="sync"/>
    <env name="DB_CONNECTION" value="sqlite"/>
    <env name="DB_DATABASE" value="testing"/>
</php>
Run Code Online (Sandbox Code Playgroud)

只需使用名称部分中的键值和值部分中该键的值即可.

对于这个例子,我指定phpunit使用带有测试名称的sqlite数据库.

顺便说一句,在config/database.php中我添加了这个 'default' => env('DB_CONNECTION', 'mysql'),默认使用mysql,除非我指定不同的东西,就像在这种情况下一样.

  • 问题是我在代码中使用 SQL 查询(不使用 ORM),因此查询在不同的数据库引擎上可能略有不同。 (2认同)
  • .env.testing 是 Laravel 的约定吗? (2认同)
  • 是的,您实际上可以查看文档以了解有关 .env.testing 文件的更多信息 https://laravel.com/docs/5.8/testing (2认同)

Bog*_*dan 11

您可以覆盖.env文件中使用的TestCase文件,引导框架进行测试.

更加具体:

测试/ TestCase.php

/**
 * Creates the application.
 *
 * @return \Illuminate\Foundation\Application
 */
public function createApplication()
{
    /* @var \Illuminate\Foundation\Application $app */
    $app = require __DIR__ . '/../bootstrap/app.php';

    $app->loadEnvironmentFrom('.env.testing'); // specify the file to use for environment, must be run before boostrap

    $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();

    return $app;
}
Run Code Online (Sandbox Code Playgroud)

所有扩展的测试TestCase都将使用此配置文件.

请注意,定义的任何设置都phpunit.xml将覆盖此配置.

更新

启动Laravel5.4,createApplication不再找到该功能tests\TestCase.它已被转移到tests\CreatesApplication特质.

  • 您的答案看起来很有希望,但由于某种原因它仍在加载 .env。 (2认同)

S..*_*S.. 9

在您的开发机器上创建本地数据库,例如“local_test_db”

创建一个新的 .env.testing 文件。

DB_DATABASE=local_test_db
DB_USERNAME=root
Run Code Online (Sandbox Code Playgroud)

确保您的 phpunit.xml 文件至少具有以下一个环境变量:

<php>
    <env name="APP_ENV" value="testing"/>
</php>
Run Code Online (Sandbox Code Playgroud)

最后,您的基本测试用例(TestCase.php)应该运行迁移以用表填充数据库:

public function createApplication()
{

    $app = require __DIR__.'/../bootstrap/app.php';

    $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();

    return $app;
}


public function setUp()
{
    parent::setUp();
    Artisan::call('migrate');
}

public function tearDown()
{
    Artisan::call('migrate:reset');
    parent::tearDown();
}
Run Code Online (Sandbox Code Playgroud)


Wal*_*ale 5

这是2019年

在解决这个问题之前,我已经解决了很长时间。

这是我的假设:

如果您还发现很难使您的PHPUnit.xml与.env.testing文件进行对话,那么您很可能正在使用PHPStorm!

如果是这样,请继续阅读。

如果没有,不...这无济于事。

好...

干得好:

  1. 转到PHPStorm的“设置”,或直接按Ctrl + Alt +S。
  2. 转到语言和框架>> PHP >>测试框架
  3. 在“测试运行器”选项卡下,单击“默认配置文件”,然后选择(通过单击文件夹图标)项目的PHPUnit.xml文件的路径。

这样做是为了使xml文件中的所有更改生效。因此,继续,创建.env.testing文件,创建用于测试的首选数据库配置变量...,然后尝试再次运行测试!


fir*_*ire 0

除了在单元测试开始之前暂时将 .env.testing 重命名为 .env 之外,我想不出其他方法。

您可以在 bootstrap/autoload.php 中放置一些逻辑,因为这是 phpunit 在加载应用程序之前使用的引导文件。