You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 9+Breeze 1.11忘记密码测试:重置链接通知断言失败

Laravel 9 + Breeze 1.11 忘记密码功能测试修复方案

核心问题分析

你的测试失败主要有两个原因:

  1. 用户未持久化到数据库:用User::factory()->make()创建的用户仅在内存中存在,Password::sendResetLink会先检查数据库中是否存在该邮箱的用户,不存在则不会发送通知,也不会生成password_resets记录。
  2. 指定了错误的通知类: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:21:28