如何在Laravel 5中配置测试环境是最佳方式?

4
我正在适应Laravel5,之前有一些L4的经验。我遇到的问题之一是环境配置,主要涉及测试方面。
我试图连接到一个mysqlite数据库,经过很多搜索,最好的解决方法就是在配置文件中添加一个条件语句,如下所示:
'default' => $app->environment('testing') ? 'sqlite':'mysql'

我的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>

然而,现在当我尝试运行测试套件时,出现以下错误:
ReflectionException: Class env does not exist.

目前,我的唯一选择似乎是创建两个单独的.env文件,一个是“测试”环境,另一个是“本地”环境,并在需要时将它们重命名为“.env”。这显然不够高效或可接受。有什么建议吗?


你的phpunit.xml文件是否和原始文件相似?https://github.com/laravel/laravel/blob/master/phpunit.xml - rap-2-h
基本上是一样的,没错。唯一的变化在于“测试套件”节点内部。 - John Richardson
你在之前运行过 composer install 吗? - rap-2-h
2个回答

0
根据文档所示,当你运行phpunit时,默认的APP_ENV是“testing”,并且在“phpunit.xml”中进行设置(http://laravel.com/docs/testing#introduction)。但是Lumen没有任何规则来加载配置文件,例如“.env.testing”或“.env.production”。
不过,Laravel为我们提供了一个回调函数。
  $app->detectEnvironment(function() use ($app){
       if (file_exists(__DIR__.'/../'.'.env.' .getenv('APP_ENV') )) {
           $app->loadEnvironmentFrom('.env.'. getenv('APP_ENV') );
       }
   });

在指定的环境下运行一些命令:

APP_ENV=testing artisan serve

然后应用程序将从/.env.testing加载配置

注意:

如果你采用我的想法,--env选项是无效的。另一种方法是添加前缀APP_ENV=testing。我认为这是Laravel的一个bug,因为在cli模式下运行命令时,DetectEnvironment闭包不会被调用。


0

我能够通过在database.php配置文件中设置env环境变量来设置不同的数据库连接:

config/database.php

-    'default' => 'mysql',
+    'default' => env('DB_CONNECTION','mysql'),

phpunit.xml

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

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