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

Laravel中如何用Mail::assertSent指定检查对应邮件内容?

Laravel测试多封邮件内容的方法

你可以通过两种方式分别检查每一封邮件的内容:

方法一:直接获取所有发送的邮件实例

Laravel的Mail facade提供了sent()方法,能返回指定类的所有已发送邮件集合,通过数组索引就能精准定位第一、第二封邮件,再针对性断言内容:

// 获取所有BuildMessage类的已发送邮件
$sentMails = Mail::sent(BuildMessage::class);

// 检查第一封邮件的各项内容
$this->assertEquals('user1@example.com', $sentMails[0]->to[0]['address']);
$this->assertEquals('账户激活通知', $sentMails[0]->subject);
$this->assertStringContainsString('请点击链接激活你的账户', $sentMails[0]->render());

// 检查第二封邮件的各项内容
$this->assertEquals('admin@example.com', $sentMails[1]->to[0]['address']);
$this->assertEquals('新用户注册提醒', $sentMails[1]->subject);
$this->assertStringContainsString('有新用户完成注册,请查看', $sentMails[1]->render());

方法二:在assertSent闭包里用计数器区分

如果想在同一个断言方法里完成所有检查,可以借助计数器来标记当前处理的是第几封邮件:

$mailCount = 0;
Mail::assertSent(BuildMessage::class, function ($mail) use (&$mailCount) {
    $mailCount++;
    
    if ($mailCount === 1) {
        // 第一封邮件的断言逻辑
        return $mail->subject === '账户激活通知' 
            && $mail->to[0]['address'] === 'user1@example.com';
    }
    
    if ($mailCount === 2) {
        // 第二封邮件的断言逻辑
        return $mail->subject === '新用户注册提醒' 
            && $mail->to[0]['address'] === 'admin@example.com';
    }
    
    return false;
}, 2); // 最后指定预期发送数量为2

这两种方法都能精准区分每一封邮件,你可以根据测试场景选择合适的方式。

内容的提问来源于stack exchange,提问作者anko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 23:12:08