【问题标题】:Laravel Testing - migrating/refreshing wrong environmentLaravel 测试 - 迁移/刷新错误的环境
【发布时间】: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

标签: php laravel testing


【解决方案1】:

在运行测试之前运行php artisan config:clear 以清除缓存,以确保配置变量没有从错误的环境中缓存。如果这无助于使用您的 IDE(例如 PHPStorm)运行 PHPUnit,并专门选择您的项目 phpunit.xml

【讨论】:

  • 对我来说就是这样。我之前运行过config:cache,我几乎要发疯了,因为我正在更改配置并且它没有任何效果。谢谢!
猜你喜欢
  • 2016-07-22
  • 1970-01-01
  • 2016-10-02
  • 2016-03-03
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
相关资源
最近更新 更多