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

时间:2015-06-25 22:28:04

标签: laravel codeception

我正在尝试使用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使用我的测试数据库?

5 个答案:

答案 0 :(得分:5)

复制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;
}

答案 1 :(得分:4)

TL; DR:

APP_ENV=testing php artisan serve

如果你运行&#34; php artisan help&#34;你会看到:

--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并在返回$ app之前添加:
<击>

if(!empty($ argv)&amp;&amp; in_array(&#39; - env = testing&#39;,$ argv)){  $ APP-&GT; loadEnvironmentFrom(&#39; .env.testing&#39); }

然后你可以用&#34; php artisan serve --env = testing&#34;

启动你的服务器

这是一种解决方法,我希望很快Laravel的某个人能够确定正确的方法。

<击>

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

APP_ENV=testing php artisan serve

然后:

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

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

答案 2 :(得分:2)

所以我厌倦了,决定做这个hacky的事情:

在.env中我添加了这个:

DB_DEFAULT=mysql

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

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

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

    putenv('DB_DEFAULT=sqlite_testing');

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

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

答案 3 :(得分:2)

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

params:
    - .env.testing

答案 4 :(得分:0)

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

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