Laravel 8에서 메일 및 데이터베이스 알림을 테스트하는 방법

저는 Laravel에서 프로젝트를 진행 중이었고 메일 알림과 데이터베이스 알림의 메일 내용을 테스트해야 했지만 이해할 수 없었습니다. 약간의 연구 끝에 실제 알림을 보내지 않고도 데이터베이스 알림뿐만 아니라 메일 알림 내용을 실제로 단위 테스트하거나 어설션할 수 있다고 생각했습니다. 이 기사에서 그 방법을 보여 드리겠습니다.

If you are reading this, I will assume that you already know how to write unit tests in Laravel using PHPUnit. If you don't , you can click to get you started.



먼저 이 Laravel 명령을 사용하여 알림을 생성합니다.php artisan make:notification TestNotification
파일은 다음과 같아야 합니다.


namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;

class TestNotification extends Notification
{
    use Queueable;

    private $user;

    public function __construct($user)
    {
        $this->$user = $user;
    }

    public function via($notifiable)
    {
        return ['mail','database'];
    }

    public function toMail($notifiable)
    {
        return (new MailMessage)
                    ->line('The introduction to the notification.')
                    ->action('Notification Action', url('/'))
                    ->line('Thank you for using our application!');
    }

    public function toArray($notifiable)
    {
        return [
            'some' => 'data'
        ];
    }
}



그런 다음 테스트에서 알림 파사드를 호출한 다음 정적 함수 fake()를 호출하여 알림을 속여야 합니다.

데이터베이스 알림을 테스트할 것입니다. 테스트 파일에서 testDatabaseNotification() 함수를 만듭니다. 그런 다음 테스트 케이스를 준비하고 행동하고 주장합니다.

public function testDatabaseNotification()
    {   
        // Arrange
        Notification::fake(); 
        $this->user = User::factory()->create();
        $email_subject = "Test Notification";

        // Act 
        $this->user->notify(new TestNotification($email_subject));

        // Assert
        Notification::assertSentTo($this->user, TestNotification::class, function ($notification, $channels) use($email_subject){
            $this->assertContains('database', $channels);

            $databaseNotification = (object)$notification->toArray($this->user);
            $this->assertEquals( $email_subject, $databaseNotification->title);

            return true;
        });
    }


이제 메일 알림을 테스트하겠습니다.

public function testMailNotification()
    {   
        // Arrange
        Notification::fake();
        $this->user = User::factory()->create();
        $email_subject = "Test notification";

        // Act
        $this->user->notify(new TestNotification($email_subject));

        // Assert
        Notification::assertSentTo($this->user, TestNotification::class, function ($notification, $channels) use($email_subject){
            $this->assertContains('mail', $channels);

            $mailNotification = (object)$notification->toMail($this->user);
            $this->assertEquals($email_subject, $mailNotification->subject,);

            $this->assertEquals('The introduction to the notification.', $mailNotification->introLines[0]);
            $this->assertEquals('Thank you for using our application!', $mailNotification->outroLines[0]);
            $this->assertEquals('Notification Action', $mailNotification->actionText);
            $this->assertEquals($mailNotification->actionUrl, url('/'));

            return true;
        });
}


여기에서 메일 알림의 내용을 검색하고 있음을 알 수 있습니다.

전체 코드는 다음과 같습니다.

<?php

namespace Tests\Unit;

use App\Notifications\TestNotification;
use Illuminate\Support\Facades\Notification;
use App\Model\User;
use Tests\TestCase;

class MailNotificationTest extends TestCase
{
    /**
     * @var \Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Eloquent\Model|mixed
     */
    private $user;

    /**
     * A basic test example.
     *
     * @return void
     */
    public function testDatabaseNotification()
    {
        Notification::fake();
        $this->user = User::factory()->create();
        $email_subject = "Test Notification";

        $this->user->notify(new TestNotification($email_subject));

        Notification::assertSentTo($this->user, TestNotification::class, function ($notification, $channels) use($email_subject){
            $this->assertContains('database', $channels);

            $databaseNotification = (object)$notification->toArray($this->user);
            $this->assertEquals( $email_subject, $databaseNotification->title);

            return true;
        });
    }

    public function testMailNotification()
    {
        Notification::fake();
        $this->user = User::factory()->create();
        $email_subject = "Test notification";

        $this->user->notify(new TestNotification($email_subject));

        Notification::assertSentTo($this->user, TestNotification::class, function ($notification, $channels) use($email_subject){
            $this->assertContains('mail', $channels);

            $mailNotification = (object)$notification->toMail($this->user);
            $this->assertEquals($email_subject, $mailNotification->subject,);

            $this->assertEquals('The introduction to the notification.', $mailNotification->introLines[0]);
            $this->assertEquals('Thank you for using our application!', $mailNotification->outroLines[0]);
            $this->assertEquals('Notification Action', $mailNotification->actionText);
            $this->assertEquals($mailNotification->actionUrl, url('/'));

            return true;
        });
    }
}


이제 Laravel 알림에서 메일 및 데이터베이스 콘텐츠를 성공적으로 어설션했습니다.
이에 대해 어떻게 생각하는지 아래 댓글에 공유해 주세요.

행복한 코딩 :)

좋은 웹페이지 즐겨찾기