Homestead环境下Laravel Dusk与工厂、迁移协同异常问题
解决Laravel Dusk测试中users表不存在&用户登录失败的问题
我之前在Homestead环境里用Dusk做测试时也踩过几乎一模一样的坑,咱们一步步来排查解决:
1. 先确认Dusk的环境配置是否真的生效
首先检查你的.env.dusk.local文件,数据库配置必须和Homestead的测试数据库匹配,比如:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=homestead_dusk_test # 这里要和你准备的测试库一致,别用主库 DB_USERNAME=homestead DB_PASSWORD=secret
然后一定要清除配置缓存,不然Dusk可能还是加载旧的配置:
php artisan config:clear
你可以在测试类里加个临时输出,验证当前连接的数据库:
use Illuminate\Support\Facades\DB; // 在测试方法开头加 dd(DB::connection()->getDatabaseName());
运行测试后看输出的数据库名是不是你在.env.dusk.local里配置的那个,如果不是,说明环境配置没加载成功。
2. 让Dusk自动执行数据库迁移(最关键的一步)
你说Dusk没执行迁移,那大概率是没在测试流程里触发迁移。Laravel提供了RefreshDatabase trait,能帮你在每次测试前自动刷新数据库并执行迁移,非常省心:
<?php namespace Tests\Browser; use Illuminate\Foundation\Testing\RefreshDatabase; use Laravel\Dusk\Browser; use Tests\DuskTestCase; use App\Models\User; class LoginTest extends DuskTestCase { use RefreshDatabase; // 引入这个trait public function test_login() { // 用工厂在测试数据库创建用户 $user = User::factory()->create([ 'email' => 'test@example.com', 'password' => bcrypt('password123'), ]); $this->browse(function (Browser $browser) use ($user) { $browser->visit('/login') ->type('email', $user->email) ->type('password', 'password123') ->press('Login') ->assertPathIs('/dashboard'); }); } }
这个trait会自动帮你处理测试数据库的迁移,不用手动执行migrate命令。
3. 手动验证测试数据库状态(排查兜底方案)
如果上面的方法还是不行,你可以登录Homestead服务器,直接检查测试数据库:
# 登录Homestead vagrant ssh # 连接MySQL mysql -u homestead -psecret # 切换到测试数据库 use homestead_dusk_test; # 换成你的测试库名 # 查看表是否存在 show tables;
如果没有users表,那手动执行一次Dusk环境的迁移:
php artisan migrate --env=dusk.local
执行完再看表是否出现,然后重新运行测试。
4. 清除Dusk缓存
有时候Dusk的缓存也会导致奇怪的问题,执行以下命令清除:
php artisan dusk:clear
最后再注意一个细节
工厂创建用户时,一定要确保是在测试方法里创建,而不是在测试类的构造函数或者其他地方,这样才能保证用户是创建在Dusk使用的测试数据库里。
内容的提问来源于stack exchange,提问作者Jessi Jaime
相关产品推荐
相关产品推荐

