Laravel Dusk测试:如何正确使用内存数据库?
Laravel Dusk内存数据库不生效?试试这几个排查步骤
我之前做Dusk测试的时候也踩过这个坑,明明配置了内存数据库,但浏览器还是显示本地库的数据。下面是几个最可能的原因和解决办法:
1. 先确认.env.dusk.local的数据库配置完全正确
必须确保你的配置是SQLite内存库,而且要删掉/注释掉多余的干扰项:
# 只保留这些必要的SQLite配置,其他DB_开头的变量请注释或删除 DB_CONNECTION=sqlite DB_DATABASE=:memory: DB_FOREIGN_KEYS=true
如果还留着DB_HOST、DB_PORT这类MySQL相关变量,Laravel可能会优先走错误的数据库连接。
2. 确保测试类继承的是DuskTestCase
普通的TestCase不会加载Dusk的环境配置,你的测试类头部应该是这样:
use Laravel\Dusk\TestCase as BaseTestCase; use Facebook\WebDriver\Chrome\ChromeOptions; use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver\Remote\DesiredCapabilities; class OrderDisplayTest extends BaseTestCase { // ... 测试代码 }
另外检查DuskTestCase里的prepare方法,确保迁移是在内存数据库上执行的:
protected function prepare() { if (! static::$prepared) { static::$prepared = true; // 这个migrate:fresh会作用在内存数据库上 $this->artisan('migrate:fresh'); } }
3. 清理缓存!这是最容易忽略的点
如果之前运行过php artisan config:cache,或者Dusk有旧缓存,它会直接用缓存的配置,完全无视.env.dusk.local。执行这两条命令清缓存:
php artisan config:clear --env=dusk.local php artisan dusk:clear
4. 测试数据必须写到内存数据库里
你预期显示'Order ABC',那一定要在测试方法内部创建这条数据,绝对不能依赖本地库的现有数据:
public function testOrderPageDisplaysTestData() { // 这里创建的订单会存在内存数据库里 \App\Models\Order::factory()->create(['name' => 'Order ABC']); $this->browse(function (Browser $browser) { $browser->visit('/orders') ->assertSee('Order ABC'); }); }
如果你的测试数据是提前在本地库创建的,浏览器自然会显示本地的内容。
5. 别手动启动本地服务器
如果你手动跑了php artisan serve,Dusk会默认连接到这个服务器,而这个服务器用的是普通的.env配置,不是Dusk的环境。测试的时候让Dusk自己启动服务器就好,它会自动加载.env.dusk.local的配置。
6. 检查config/database.php的SQLite配置
确保SQLite的配置能正确读取环境变量:
'sqlite' => [ 'driver' => 'sqlite', 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), ],
这里DB_DATABASE要能正确获取到:memory:,如果硬编码成了database.sqlite,那肯定会用本地文件库。
按上面的步骤排查下来,基本就能解决问题了。我当时就是因为忘了清缓存,折腾了好半天😂
内容的提问来源于stack exchange,提问作者Hiroki
相关产品推荐
相关产品推荐

