使用 Laravel 5.4 (dusk) 模拟邮件

Mocking mail with Laravel 5.4 (dusk)

我正在尝试在 Laravel 5.4 中的浏览器测试中测试邮件。

我在 InvitationTest class 的 browse 回调函数中有这段代码:

\Mail::fake();

$browser->visit('projects')
    ->press('etc.')

\Mail::assertSent(InvitationMail::class, function ($mail) use ($project) {
    return $mail->invitation->project->id == $project->id;
});

我可以在日志中看到邮件已发送:

[2017-04-06 15:36:10] local.INFO: Invitation xxxx-yyyy-zzz-aa-bb started
[2017-04-06 15:36:10] local.DEBUG: Message-ID: <xxx@yyy.dev>
Date: Thu, 06 Apr 2017 15:36:10 +0200
Subject: hello world :)

但是运行php artisan dusk我得到了:

1) Tests\Browser\InvitationTest::testCreateInvitation
The expected [App\Mail\InvitationMail] mailable was not sent.
Failed asserting that false is true.

邮件已排队,但在我的 .env.dusk.local 中,我已将队列设置为同步(并将邮件设置为日志):

QUEUE_DRIVER=sync
MAIL_DRIVER=log

所以一切都一定很好。难道我做错了什么?为什么 dusk 说邮件未发送?

重要说明:邮件不是直接通过 Controller 发送的,而是创建了一个延迟作业,并由该作业发送邮件。延迟的作业是过去发送的,所以可能不会有影响。明确一点:控制器调度一个作业,然后这个作业发送多封邮件。

不幸的是,模拟不适用于 Laravel Dusk。虽然,关于这个问题有两个问题是开放的:

Dusk 在单独的进程中运行,因此在进行 Dusk 测试时无法使用 Mail::fake()。实际上,就像您直接使用您的应用程序一样,只需使用测试变量。

顺便说一下,这里有一种方法可以在进行 Dusk 测试时测试电子邮件 - https://medium.com/@naneri/how-to-test-laravel-dusk-emails-826e77c4d53d