Laravel Dusk 合并到默认环境文件中
Laravel Dusk merges in the default environment file
我刚刚遇到了下面的场景...
假设您在浏览器中使用 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' => '',
],
如果您出于任何原因仍然需要覆盖此设置,您可以引入一个 new 环境变量来替换 DB_DATABASE
,它不会与默认设置冲突,但是我认为对于大多数情况,上述是一个完美的解决方案。
我刚刚遇到了下面的场景...
假设您在浏览器中使用 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' => '',
],
如果您出于任何原因仍然需要覆盖此设置,您可以引入一个 new 环境变量来替换 DB_DATABASE
,它不会与默认设置冲突,但是我认为对于大多数情况,上述是一个完美的解决方案。