【发布时间】:2018-03-19 09:14:53
【问题描述】:
Laravel v5.5.14
PHPUnit v6.4.1
我有一个带有许多功能测试的 Laravel 应用程序。我的基础TestCase 使用RefreshDatabase 特征在每次测试之前触发数据库刷新,我的phpunit.xml 中的环境变量看起来像这样;
<php>
<env name="APP_ENV" value="testing"/>
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
</php>
目的是不理会开发mysql DB 连接并使用内存中的sqlite 运行测试。尽管有这些设置(并清除缓存的配置等),数据库刷新始终会刷新mysql 连接数据库。
我查看了 RefreshDatabase 中的功能并调试了 refreshDatabase 方法,其中包含;
$this->usingInMemoryDatabase()
? $this->refreshInMemoryDatabase()
: $this->refreshTestDatabase();
usingInMemoryDatabase 总是返回 false。查看该方法的内容,当从 config 检索 DB_CONNECTION 时,它总是返回 mysql,即使它应该被上面的 env 变量覆盖。
这是怎么回事?
【问题讨论】:
-
也许配置被缓存了?尝试删除
/bootstrap/cache/config.php(如果存在)。 -
如果你在
.env文件中设置这个数据库会发生什么?也许没有使用来自phpunit.xml的配置?你是手动运行这个测试,还是通过一些 CI,例如 Jenkins? -
这可能是因为您在 shell 环境中设置了
DB_CONNECTION。 PHPUnit 默认不会覆盖这些变量,但你可以强制覆盖它们stackoverflow.com/a/43717277/4233593