我有以下单元测试:
use \Illuminate\Notifications\DatabaseNotification;
public function testMailSentAndLogged()
{
Notification::fake();
$user = factory(User::class)->create();
$emailAddress = $user->emailAddress;
$emailAddress->notify(new UserCreated);
Notification::assertSentTo(
$emailAddress,
UserCreated::class
);
error_log('DatabaseNotification '.print_r(DatabaseNotification::get()->toArray(), 1));
$this->assertEquals(1, $emailAddress->notifications->count());
}
我的通知适用于via()
:
public final function via($notifiable)
{
// complex logic...
error_log('mail, database');
return ['mail', 'database'];
}
代码在$this->assertEquals
代码上失败。 error_log产生以下内容:
[03-Jan-2018 01:23:01 UTC] mail, database
[03-Jan-2018 01:23:01 UTC] DatabaseNotification Array
(
)
为什么不$emailAddress->notifications
拉出任何东西?为什么没有DatabaseNotification::get()
拉什么东西?
答案 0 :(得分:1)
在测试中,您正在调用方法
Notification::fake();
如Laravel's documentation on Mocking中所述,
您可以使用Notification facade的假方法来阻止 发送通知。
实际上,这段代码是在正常情况下(即prod)发送通知的断言:
Notification::assertSentTo();
如果删除对Notification :: fake()的调用,您的通知应出现在测试数据库中。
所以你有两个解决方案。第一个是删除对fake()的调用,从而真正发送通知,该通知将出现在数据库中。第二个是不测试通知是否在数据库中成功写入:它是Laravel的责任,而不是你的应用程序。我推荐第二种解决方案:)