Laravel Dusk合并在默认环境文件中

时间:2018-04-26 15:05:55

标签: laravel sqlite testing 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,如果您正在运行默认迁移。

1 个答案:

答案 0 :(得分:1)

有很多解决方案覆盖了测试的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' => '',
],

如果由于任何原因仍需要覆盖此设置,您可能会引入一个 new 环境变量,替换DB_DATABASE不会与默认设置发生冲突,但我认为对于大多数情况以上是一个完美的解决方案。