测试通知后,数据库通知不会显示

时间:2018-01-03 01:29:49

标签: laravel laravel-5 notifications eloquent phpunit

我有以下单元测试:

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()拉什么东西?

1 个答案:

答案 0 :(得分:1)

在测试中,您正在调用方法

Notification::fake();

Laravel's documentation on Mocking中所述,

  

您可以使用Notification facade的假方法来阻止   发送通知。

实际上,这段代码是在正常情况下(即prod)发送通知的断言:

Notification::assertSentTo();

如果删除对Notification :: fake()的调用,您的通知应出现在测试数据库中。

所以你有两个解决方案。第一个是删除对fake()的调用,从而真正发送通知,该通知将出现在数据库中。第二个是不测试通知是否在数据库中成功写入:它是Laravel的责任,而不是你的应用程序。我推荐第二种解决方案:)