如何使用 Laravel 队列邮件编写单元测试?

问题描述 投票:0回答:3

我已经完成了通过队列发送邮件的代码,并且工作正常, 我想为它编写一个测试(只是想测试应该正常发送的邮件,而不会通过队列失败,并且发送给正确的人),但是如何呢?

Mail::to($user->email)->queue(new Welcome($user));
laravel email testing queue tdd
3个回答
9
投票

你会做这样的事情(取决于你的设置):

<?php

namespace Tests\Feature;

use App\User;
use App\Mail\Welcome;
use Illuminate\Support\Facades\Mail;

class SendInvitationEmailTest extends TestCase
{
    /** @test */
    function mails_get_queued()
    {
        Mail::fake();
        $user = factory(User::class)->create();
         
        $this->post('/route/to/send/the/welcome/mail');

        // Mail::assertQueued(Welcome::class);
        Mail::assertQueued(Welcome::class, function ($mail) use ($user) {
            return $mail->user->id === $user->id;
        });
    }
}

2
投票

我建议从

Mail::queued
获取排队的电子邮件。这是一个简单的数组,可以为您提供所需的所有功能。

像这样:

$queuedEmails = Mail::queued(CustomerEmail::class);
$this->assertCount(1, $queuedEmails);
$email = $queuedEmails[0];
$this->assertEquals('status_complete', $email->handle);

您可以按照习惯运行断言,这会在失败时提供更有意义的消息。不幸的是,

Mail::assertQueued
的失败报告不是很具体或有帮助:

The expected [App\Mail\MyEmail] mailable was not queued.
Failed asserting that false is true.

如果您只是在回调版本中返回 true 或 false。请注意,您可以在回调中使用断言,这很棒,但如果您需要检查多封电子邮件,那就更尴尬了。


-1
投票

现在我正在使用 MailTracking 来测试邮件 https://gist.github.com/anonymous/6e802e56af1f19d53464d667b3e6aa48

© www.soinside.com 2019 - 2024. All rights reserved.