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
相关产品推荐
相关产品推荐

