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

How to Write a unit test with laravel queue mail?

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

Mail::to($user->email)->queue(new Welcome($user));

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

<?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, 1);
        Mail::assertQueued(Welcome::class, function ($mail) use ($user) {
            return $mail->user->id === $user->id;
        });
    }
}

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

我建议从 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.

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