我正在用Mail::fake();
开始测试。然后,一个事件触发一个监听器,该监听器发送一封电子邮件:
Mail::send('path_to_a_view', $data, function(Message $message) {
// set "to" and subject.
});
监听器实现ShouldQueue
接口。
在我的测试中,我试图检查电子邮件是否使用Mail::assertQueued(...);
进行排队(我已经为这种方法尝试了多个类名,因为我不确定哪种情况适用于我的情况)。
但由于总是失败,我发现send
类中的MailFake
方法拒绝了用视图创建的邮件。负责这种行为的是following line。
它为什么简单地回归?如何测试我的邮件是否已排队?
您需要针对您正在执行的操作实施两个单独的测试。
第一个测试将测试该事件被触发(Event::fake()
)。第二个测试是检查如果事件被触发,那么你的侦听器上的handle()
函数会将邮件排队(Mail::fake()
)。
如果您只是想检查邮件,只需省略实施第一个测试。
注意:对于第二个测试,您实际上不需要调度事件,只需解析侦听器(
resolve(FQNListener::class)->handle(new resolve(FQNEvent::class))
)并测试您的邮件是否排队:Mail::assertQueued(FQNMail::class)
为了使所有这一切工作,不要使用回调作为“电子邮件”,而是真正的类。 (php artisan make:mail ...
)
注意:如果您所做的只是发送电子邮件,也请考虑删除中间人(事件+监听器)。