Laravel 9+Breeze 1.11忘记密码测试:重置链接通知断言失败
Laravel 9 + Breeze 1.11 忘记密码功能测试修复方案
核心问题分析
你的测试失败主要有两个原因:
- 用户未持久化到数据库:用
User::factory()->make()创建的用户仅在内存中存在,Password::sendResetLink会先检查数据库中是否存在该邮箱的用户,不存在则不会发送通知,也不会生成password_resets记录。 - 指定了错误的通知类:Breeze默认使用Laravel内置的
Illuminate\Auth\Notifications\ResetPassword发送重置链接,而非你自定义的SubscriptionEmailingNotification,除非你主动重写了密码重置的通知逻辑。
修复后的测试代码(默认Breeze场景)
public function testAdminGotPasswordResetLinkEmail() { Notification::fake(); // 用create()将用户存入数据库 $admin = User::factory()->create(); // 提交重置请求 $this->post(route('password.email'), [ 'email' => $admin->email, ]); // 断言内置的ResetPassword通知已发送给该用户 Notification::assertSentTo( $admin, \Illuminate\Auth\Notifications\ResetPassword::class, function ($notification) use ($admin) { // 可选:验证通知中的token能匹配数据库中的记录 $resetRecord = DB::table('password_resets')->where('email', $admin->email)->first(); return Hash::check($notification->token, $resetRecord->token); } ); }
如果使用自定义通知类的场景
如果你确实需要用自己的SubscriptionEmailingNotification发送重置链接,需要先在User模型中重写sendPasswordResetNotification方法:
// app/Models/User.php use App\Notifications\SubscriptionEmailingNotification; public function sendPasswordResetNotification($token) { $this->notify(new SubscriptionEmailingNotification($token)); }
之后再把测试中的通知类换回SubscriptionEmailingNotification::class,同时保持用户用create()创建的逻辑即可。
额外注意事项
- 测试前确保
password_resets表存在(Laravel默认迁移已包含该表)。 - 无需手动打印日志排查,
Notification::fake()会拦截所有通知,直接通过断言即可验证发送状态。
内容的提问来源于stack exchange,提问作者mstdmstd
相关产品推荐
相关产品推荐

