如何使用 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。请注意,您可以在回调中使用断言,这很棒,如果您需要检查不止一封电子邮件,那就更尴尬了。
我已经完成了按队列发送邮件的代码,并且工作正常, 我想为它写一个测试(只是想测试它应该正常发送的邮件,而不是通过队列失败,并且发送给正确的人),但是如何?
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。请注意,您可以在回调中使用断言,这很棒,如果您需要检查不止一封电子邮件,那就更尴尬了。