Laravel 5应用程序始终使用“testing”环境配置

13

我有一个Laravel 5应用程序,有两个环境和两个配置:testing(用于PHPUnit配置,内存db)和local(我的开发配置)。

即使将环境配置为local,应用程序仍然只加载resources/config/testing文件夹中的配置。我可以从APP_ENV环境变量中看到相同的应用程序环境,并且它是local

  • 我是否应该不使用testing配置目录来配置我的测试?

  • Laravel 5中配置我的测试环境有更好的方法吗?


请分享您的环境设置代码。 - Miroslav Trninic
我的.env文件只包含基本的内容,例如APP_ENV=local - 我会在下班回家后复制整个文件。 - Simon Fredsted
3个回答

28

Laravel 5无法正确地级联配置文件,因此您的测试配置文件正在覆盖您本地配置文件中的任何内容。

现在,您不应该为每个环境设置任何子文件夹,而是在根文件夹中的.env文件中设置配置设置。

为确保不会将敏感信息提交到代码库中,此文件不会被检入代码库。您应该为应用程序所在的每个环境拥有一个单独的.env文件。

测试

对于phpunit(功能测试),您可以在phpunit.xml文件中设置环境变量,例如:

<php>
    <env name="APP_ENV" value="testing"/>
    <env name="CACHE_DRIVER" value="array"/>
    <env name="SESSION_DRIVER" value="array"/>
</php>

对于 Behat(验收)测试,Laracasts Laravel Behat 扩展允许您创建一个 .env.behat 文件来更改环境变量。

对于 phpspec(单元)测试,环境不应该成为问题,因为您在孤立地测试各个方法并模拟其他所有内容。

对于 Selenium(集成/系统/e2e)测试,环境变量应该来自服务器上的 .env 文件,无论您在哪里进行此测试。


我在我的集成测试中使用phpunit,因此需要使用一个单独的数据库。这解决了我的问题,谢谢! - Mārtiņš Briedis
已点赞,但希望也能看到 Codeception 的解决方案。 - Nate Ritter

17

以下是我最近为了在sqlite上运行测试而不得不使用的一些额外技巧,而主应用程序通常默认使用mysql:

根据craig.michael.morris的解释,在phpunit.xml中添加类似下面这样的内容:

<env name="DB_DRIVER" value="sqlite"/>

还有对config/database.php的更改

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

在config/database.php文件中的'sqlite'部分

'database' => ':memory:',

7
感谢回复:在 Laravel 5.1 中,我需要使用 DB_CONNECTION 替代 DB_DRIVER,例如:<env name="DB_CONNECTION" value="sqlite"/>,我从 config/database.php 文件中获取了这个值。 - racl101
几天前我自己发现了这个问题,然后碰巧看到了你的评论 :) 给你点赞! - markdwhite

3

1) 打开配置文件 database.php,并在'connections' => [中添加以下内容:

'sqlite_testing' => [
    'driver'   => 'sqlite',
    'database' => ':memory:',
    'prefix'   => '',
],

这个内存中的sqlite将被用于你的测试。
2)打开.env文件,并确保它包含以下内容:
DB_CONNECTION=mysql

3) 打开phpunit.xml并在<php>标签内添加以下内容:

<env name="DB_CONNECTION" value="sqlite_testing"/>

这里是您可以添加所有与测试相关的环境变量的位置。

4)在使用数据库连接的测试中,请使用数据库迁移特性:

use DatabaseMigrations;

关于数据库迁移的更多细节,请参阅文档https://laravel.com/docs/5.1/testing#resetting-the-database-after-each-test


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接