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

Joe*_*nks 4 laravel codeception

我试图使用sqlite db进行测试,因为我不想触摸我的实际数据库:

在我的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
Run Code Online (Sandbox Code Playgroud)

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

        Artisan::call('migrate:reset');
        Artisan::call('migrate');
        Artisan::call('db:seed');
Run Code Online (Sandbox Code Playgroud)

我还将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' => ''
        ],
    ]
];
Run Code Online (Sandbox Code Playgroud)

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

car*_*ini 5

长话短说:

APP_ENV=testing php artisan serve
Run Code Online (Sandbox Code Playgroud)

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

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

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

然后你可以使用“php artisanserve --env=testing”启动你的服务器

这是一种解决方法,我希望 Laravel 的人很快就能定义正确的方法来做到这一点。

更新:这种方式不太混乱:

APP_ENV=testing php artisan serve
Run Code Online (Sandbox Code Playgroud)

进而:

if (getenv('APP_ENV') === 'testing') { 
    $app->loadEnvironmentFrom('.env.testing');
}
Run Code Online (Sandbox Code Playgroud)

更新2:看来你不需要5.2中的上述条件,或者可能永远不需要?


Mih*_*nik 5

在这里复制我博客一部分......

在搜索了一下后,我们假设在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>
Run Code Online (Sandbox Code Playgroud)

但是我想使用.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;
}
Run Code Online (Sandbox Code Playgroud)


Joe*_*nks 2

所以我厌倦了并决定做这件事:

在 .env 中我添加了这个:

DB_DEFAULT=mysql
Run Code Online (Sandbox Code Playgroud)

然后我将 sqlite_testing 配置添加到 database.php 文件中,并更改了默认设置,如下所示:

'default' => env('DB_DEFAULT', 'mysql'),
Run Code Online (Sandbox Code Playgroud)

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

    putenv('DB_DEFAULT=sqlite_testing');
Run Code Online (Sandbox Code Playgroud)

我坚持这样做是因为它确实有效,但任何评论/建议都会受到赞赏。我在 laracasts 网站上找到了这个解决方案:

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