Laravel测试中如何获取Symfony Email实例以验证Message-ID
在Laravel测试中获取Symfony Email实例验证Message-ID
你可以通过Laravel邮件实例的getSymfonyMessage()方法直接拿到对应的Symfony\Component\Mime\Email对象,不管是用Mail::assertSent还是Mail::assertQueued都适用。
具体测试代码示例
假设你的邮件类是OrderConfirmationMail,测试代码可以这么写:
use Illuminate\Support\Facades\Mail; use App\Mail\OrderConfirmationMail; test('sent email has correct Message-ID', function () { // 触发邮件发送的业务逻辑,比如创建订单 $order = Order::factory()->create(); Mail::assertSent(OrderConfirmationMail::class, function ($mail) { // 获取Symfony Email实例 $symfonyMessage = $mail->getSymfonyMessage(); // 提取Message-ID头部值 $messageId = $symfonyMessage->getHeaders()->get('Message-ID')->getValue(); // 验证是否符合预期 return $messageId === 'mymessageid@domain.com'; }); });
队列邮件的验证方式
如果你的邮件是通过队列发送的,只需把assertSent替换为assertQueued,逻辑完全一致:
Mail::assertQueued(OrderConfirmationMail::class, function ($mail) { $symfonyMessage = $mail->getSymfonyMessage(); $messageId = $symfonyMessage->getHeaders()->get('Message-ID')->getValue(); return $messageId === 'mymessageid@domain.com'; });
版本兼容说明
这个方法在Laravel 8及以上版本均支持,如果你使用的是更早的版本(Laravel 8之前),由于当时底层用的是SwiftMailer而非Symfony Mime,需要对应调整获取邮件实例的方式,但你的代码中已经使用了Symfony的Email类,说明你使用的是Laravel 9+版本,直接用上述方法即可。
内容的提问来源于stack exchange,提问作者Mateusz Bielak
相关产品推荐
相关产品推荐

