laravel - Laravel Dusk 在默认环境文件中合并
问题描述
我刚刚遇到了以下场景......
假设您在浏览器中使用 MySQL 数据库,但更喜欢使用 SQLite 数据库进行 Dusk 测试。我认为这是一个很常见的情况,或者可能是。所以你可能会做这样的事情:
在您的.env
文件中:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
在您的.env.dusk.local
文件中:
DB_CONNECTION=sqlite
有人可能认为这可行,但问题是运行 Dusk 时会合并环境文件。也就是说,Dusk 配置会变成:
DB_CONNECTION=sqlite
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
如果您查看 SQLite 的默认 Laravel 配置:
'sqlite' => [
'driver' => 'sqlite',
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
],
您会注意到它将尝试homestead
在您的项目根目录中获取 SQLite 数据库,该数据库不存在 - 显然,您的测试将失败并出现以下错误:users table not found
例如,如果您正在运行默认迁移。
解决方案
有很多解决方案可以覆盖CreatesApplication
测试特征中的配置。哪个可以工作,但您必须记住,PHPUnit 也使用相同的特征。此外,在设置 CI 时,它可能会导致其他棘手的错误,就像我的情况一样。此外,这对可发现性也没有真正的帮助......
他们说优雅在于简单,所以我认为最好的解决方案是更改默认配置并从您的 sqlite 连接中删除环境变量。所以这
'sqlite' => [
'driver' => 'sqlite',
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
],
会变成这样
'sqlite' => [
'driver' => 'sqlite',
'database' => database_path('database.sqlite'),
'prefix' => '',
],
如果您出于任何原因仍需要覆盖此设置,您可能会引入一个新的环境变量替换DB_DATABASE
,它不会与默认设置冲突,但我认为对于大多数情况而言,以上是一个完美的解决方案。
推荐阅读
- android - 程序类型已经存在:com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable
- python - 如何将两个程序合并为一个程序?
- python - Kivy.garden.progressspinner 中的黑线
- debugging - WatchOS5 - 如何调试苹果手表应用程序?
- prolog - 防止回溯而不切割
- ag-grid - ag-Grid 设置过滤和排序模型而不触发事件
- django - 使用 JSONField 的属性对 Django 查询集进行排序
- reactjs - 不断收到错误“未定义不是对象(评估'_this.refs.name.value')”
- javafx - 为什么编译器在使用 TableColumn 时会生成未经检查的警告
而不是 TableColumn在 JavaFX8 TableView 中选择一个单元格? - python - Google Cloud Functions - 如何对 AWS S3 存储桶进行身份验证?