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

如何正确更改测试环境vars-Codeception和Laravel 5.1,laravel,codeception,Laravel,Codeception,我尝试使用sqlite db进行测试,因为我不想接触我的实际数据库: 在my unit.suite.yml文件中: class_name: UnitTester modules: enabled: [Asserts, UnitHelper] config: Db: dsn: 'sqlite:app/tests/_data/testdb.sqlite' user: '' password: ''

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

在my 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' => ''
        ],
    ]
];

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

在.env中,我添加了以下内容:

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

'default' => env('DB_DEFAULT', 'mysql'),
最后,我在TestCase.php的开头添加了以下内容:

    putenv('DB_DEFAULT=sqlite_testing');
我坚持这一点,因为它确实有效,但任何评论/建议都将不胜感激。我在laracasts网站上找到了此解决方案:

TL;博士:

APP_ENV=testing php artisan serve

如果运行“php artisan帮助”,您将看到:

--env[=ENV]       The environment the command should run under.
  • --env=测试不再更改.env文件。所以这个信息是不完整的
  • 像config/testing/database.php这样的文件在Laravel4.2上工作,在Laravel5上不工作
  • PHPUnit通过PHPUnit.xml设置环境变量,但它不适用于Codeception
  • Codeception有一个,您可以在那里将环境_文件设置为.env.testing,然后您可以使用此文件进行测试。但是,它在验收测试上不起作用,因为这些测试会打开浏览器。 在这种情况下,您可以自定义app.php并在返回$app之前添加:
如果(!empty($argv)&&in_数组('--env=testing',$argv)){ $app->loadEnvironmentFrom('.env.testing'); }

然后,您可以使用“php artisan服务--env=testing”启动服务器

这是一个解决办法,我希望很快有人从拉威尔将定义正确的方式来做到这一点

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

APP_ENV=testing php artisan serve
然后:

if (getenv('APP_ENV') === 'testing') { 
    $app->loadEnvironmentFrom('.env.testing');
}
更新2:您似乎不需要5.2中的上述条件,或者可能从未需要过?

复制

在搜索了一点之后,我们假设在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>

为此,我使用
tests/_bootstrap.php

<?php
// This is global bootstrap for autoloading
putenv('MY_ENV_NAME=my_env_valye');
在项目根目录中的codeception.yml文件(请参阅中的文档)中检查参数的值,应如下所示

params:
    - .env.testing

你确定app/config/testing/database.php
?我相信这在Laravel 5中被忽略了,因为迁移到
.env
文件。如果我在该文件中执行dd(),它将停止测试执行,因此至少正在读取它。也就是说,我应用了下面列出的黑客解决方案。现在您有了此修复程序,请尝试
'database'=>'sqlite:memory'
,看看它是否也能工作。很抱歉,它应该是
'database'=>':memory:'
我以前发送过类似的解决方案,所以我想它在下一个版本中将可用
params:
    - .env.testing