Laravel 10 Dusk登录测试失败,请求调试帮助
刚完成Laravel Dusk全新安装,编写登录测试代码如下:
use Laravel\Dusk\Browser; use App\Models\User; use Spatie\Permission\Contracts\Role; beforeEach(function () { $this->user = User::factory()->create([ 'email' => 'blueshoon@blueshoon.net', 'password' => Hash::make('password'), ]); $role = app(Role::class)->findOrCreate('User', 'web'); $this->user->assignRole($role); }); test('user login', function () { $this->browse(function (Browser $browser) { $browser->visit('/') ->type('email', $this->user->email) ->type('password', 'password') ->click('button[type="submit"]') ->assertPathIs('/dashboard'); }); });
测试始终提示用户不存在,已创建Dusk专属.env文件和独立数据库。注释掉Dusk测试类中的LazilyRefreshDatabase后,能看到用户已存入数据库,且验证控制器的凭证正确,需要调试该问题的方法。
调试步骤
确认Dusk数据库连接配置
检查Dusk专属.env文件(如env.dusk.local)中的数据库参数,确保DB_DATABASE、DB_USERNAME等配置和你手动查看的测试数据库完全一致,避免Dusk实际连接了错误的数据库。验证
LazilyRefreshDatabase的执行逻辑
在beforeEach方法中添加dd(User::pluck('email')),运行测试时查看是否输出了创建的用户邮箱;或者在测试的click操作前添加$browser->pause(10000),让浏览器暂停10秒,期间手动查询测试数据库,确认用户是否存在。检查密码哈希一致性
在beforeEach中输出$this->user->password,然后手动对字符串password执行Hash::make('password'),对比两者是否一致;也可以临时修改测试代码,用$browser->type('password', $this->user->password)提交哈希后的密码,测试是否能登录。核对登录请求参数
在登录控制器的验证方法中添加Log::info(request()->all()),运行Dusk测试后查看日志,确认请求中的email和password是否和预期一致,排除前端输入框name属性与代码中type()方法参数不匹配的问题(比如输入框name是user_email而非email)。清空浏览器会话
在browse闭包开头添加$browser->deleteCookie('laravel_session'),确保每次测试都是全新的会话,避免旧缓存或会话干扰登录验证。排查Spatie权限包的影响
暂时注释掉角色分配的代码,测试基础登录流程是否正常;或者在beforeEach中添加dd($this->user->hasRole('User')),确认用户确实被正确分配了角色,排除权限验证导致的登录失败。生成错误截图与页面信息
在测试中添加$browser->screenshot('login-failure'),生成失败时的页面截图;或者用$browser->dump()输出页面HTML,查看表单提交后的具体错误提示,定位问题来源。
内容的提问来源于stack exchange,提问作者pandabrand

