我已经完成了通过队列发送邮件的代码,并且工作正常, 我想为它编写一个测试(只是想测试应该正常发送的邮件,而不会通过队列失败,并且发送给正确的人),但是如何呢?
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);
Mail::assertQueued(Welcome::class, function ($mail) use ($user) {
return $mail->user->id === $user->id;
});
}
}
我建议从
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。请注意,您可以在回调中使用断言,这很棒,但如果您需要检查多封电子邮件,那就更尴尬了。
现在我正在使用 MailTracking 来测试邮件 https://gist.github.com/anonymous/6e802e56af1f19d53464d667b3e6aa48