如何正确更改测试环境变量 - Codeception 和 Laravel 5.1

How to properly change testing environment vars - Codeception and Laravel 5.1

我正在尝试使用 sqlite 数据库进行测试,因为我不想触及我的实际数据库:

在我的 unit.suite.yml 文件中:

class_name: UnitTester
modules:
    enabled: [Asserts, UnitHelper]
    config:
        Db:
            dsn: 'sqlite:app/tests/_data/testdb.sqlite'
            user: ''
            password: ''
            dump: app/tests/_data/dump.sql

在我的 TestCase.php 文件中,我有一个函数可以重置和迁移数据库并为测试播种:

        Artisan::call('migrate:reset');
        Artisan::call('migrate');
        Artisan::call('db:seed');

我还将 sqlite 设置添加到 app/config/testing/database。php:

<?php
// Codeception testing environment uses SQLITE

return [

    'default' => 'sqlite',

    'connections' => [
        'sqlite' => [
            'driver' => 'sqlite',
            'database' => 'app/tests/_data/testdb.sqlite',
            'prefix' => ''
        ],
    ]
];

我可以验证 database.php 文件正在被读取,但仍然有一些东西阻止了 sqlite 的使用,我仍然最终使用了我的 REAL 数据库 (MySQL)。我如何强制 Laravel/Codeception 使用我的测试数据库?

所以我受够了,决定做这件骇人听闻的事:

在 .env 中我添加了这个:

DB_DEFAULT=mysql

然后我将我的 sqlite_testing 配置添加到 database.php 文件中,然后像这样更改了默认设置:

'default' => env('DB_DEFAULT', 'mysql'),

最后,我将此添加到 TestCase.php 的开头:

    putenv('DB_DEFAULT=sqlite_testing');

我坚持使用它,因为它确实有效,但任何 comment/suggestions 都值得赞赏。我在 laracasts 网站上找到了这个解决方案:

https://laracasts.com/discuss/channels/testing/how-to-specify-a-testing-database-in-laravel-5

长话短说:

APP_ENV=testing php artisan serve

如果你 运行 "php artisan help" 你会看到:

--env[=ENV]       The environment the command should run under.
  • --env=testing 不再更改 .env 文件。所以这个信息是不完整的。
  • 像 config/testing/database.php 这样的文件可以在 Laravel 4.2 上运行,但不能在 Laravel 5
  • 上运行
  • PHPUnit 通过 phpunit.xml 设置环境变量,但它不适用于 Codeception。
  • Codeception有一个module for Laravel 5,在那里你可以设置environment_file.env.testing 然后您可以使用此文件进行测试。但是,它不适用于验收测试,因为这些测试会打开浏览器。 在这种情况下,您可以自定义 app.php 并将其添加到 return $app:
  • 之前

if (!empty($argv) && in_array('--env=testing', $argv)) { $app->loadEnvironmentFrom('.env.testing'); }

然后你可以用"php artisan serve --env=testing"

启动你的服务器

这是一个变通方法,我希望 Laravel 的人能尽快定义执行此操作的正确方法。

更新:这种方式不那么混乱:

APP_ENV=testing php artisan serve

然后:

if (getenv('APP_ENV') === 'testing') { 
    $app->loadEnvironmentFrom('.env.testing');
}

更新 2:您似乎不需要 5.2 中的上述条件,或者可能根本不需要?

复制一个part of my blog here ...

经过一番搜索,我们假设在 phpunit.xml 中包含变量。有一些预先包含的

<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"/>
</php>

但是我想使用 .env 文件。所以总有办法:)

您现在需要做的就是使用适当的 env 文件调用应用程序 loadEnvironmentFrom($file)。因为我只需要它进行测试,所以我添加了 .env.testing.example 和 .env.testing(从 git 中排除)。我在 /tests/TestCase.php

中添加了对方法的调用
public function createApplication()
{
    $app = require __DIR__.'/../bootstrap/app.php';

    //THIS IS IT :)
    $app->loadEnvironmentFrom('.env.testing');

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

    return $app;
}

我为此目的使用 tests/_bootstrap.php

<?php
// This is global bootstrap for autoloading
putenv('MY_ENV_NAME=my_env_valye');

在项目根目录的 codeception.yml 文件(参见文档 https://codeception.com/docs/06-ModulesAndHelpers#Dynamic-Configuration-With-Parameters)中检查参数的值,应该类似于以下内容

params:
    - .env.testing