開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. Laravel >
  5. LaravelのNotificationに対してのテストコードを作成する方法

LaravelのNotificationに対してのテストコードを作成する方法

こんにちは。
ニシザワです。

本日はLaravelにおけるNotificationのテストコードについて書きたいと思います。
送信していることを中心に説明します。

準備

環境

  • ・Laravel5.8
  • ・PHP7.3

説明しないこと

この記事では、phpunitの説明や実行方法,LaravelにおけるNotificationの実装方法は説明しません。
Notificationのテストコードにフォーカスして書きます。

前提

ECサイトの決済が完了したときに送る領収書notificationを例に テストコードを作成します。

ソースコード一覧

Notificationを発火させるビジネスロジック


<?php
declare(strict_types=1);

namespace App\Services;

use App\User;
use App\Invoice;
use App\Notifications\InvoicePaid;

class InvoicePaidNotifier
{
    /**
     * 領収書を送る。
     * @property Invoice $invoice
     * @property User $user
     */
    public function notifier(Invoice $invoice, User $user)
    {
        $user->notify(new InvoicePaid($invoice));
    }
}

Notificationを実行するクラス


<?php
declare(strict_types=1);

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\MailMessage;
use App\Invoice;

class InvoicePaid extends Notification
{
    use Queueable;

    /**
     * @var Invoice
     */
    protected $invoice;

    /**
     * コンストラクタ
     * @param Invoice $invoice
     */
    public function __construct(Invoice $invoice)
    {
        $this->invoice = $invoice;
    }

    /**
     * Get the notification's delivery channels.
     *
     * @param mixed $notifiable
     * @return array
     */
    public function via($notifiable): array
    {
        return ['mail'];
    }

    /**
     * Get the mail representation of the notification.
     *
     * @param mixed $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toMail($notifiable): MailMessage
    {
        return (new MailMessage)
            ->subject(__('お支払いありがとうございました。'))
            ->view("emails.invoice_paid", [
                'name' => $notifiable->name,
                'invoice' => $this->invoice,
            ]);
    }
}

メールで、内容を送信している簡単なクラスです。

単純なクラスです。LaravelのNotificationを送るためだけの関節そうですね。

Notificationのテストコード


<?php

namespace Tests\Unit;

use App\User;
use App\Invoice;
use App\Notifications\InvoicePaid;
use App\Services\InvoicePaidNotifier;

class ShippedNotificationTest extends TestCase


    /**
     * @testdox 領収書の通知が可能
     */
    public function testInvoicePaidNotificationSuccess()
    {
        Notification::fake();
        Notification::assertNothingSent();

        $invoice = factory(Invoice::class)->create();
        $user = factory(User::class)->create();
        $userOther = factory(User::class)->create();
        $service = $this->app->make(InvoicePaidNotifier::class);

        $service->notifier($invoice, $user);

        Notification::assertSentTo(
            $user,
            InvoicePaid::class,
            function (InvoicePaid $notification) use (
                $user
            ) {
                $mail = $notification->toMail($user);
                $this->assertEquals($user, $mail->viewData['user']);
                return true;
            });

        Notification::assertNotSentTo(
            [$userOther], InvoicePaid::class
        );
    }

ポイントはassertSentToassertNotSentToを使って
通知対象に通知されているかを確認するところです。
また、assertSentToの第3引数で送信内容のコールバックを設定できますので、そちらで送るべきデータの確認も入れることができます。
今回は簡単な例ですが、通知対象が複数あり条件によって対象を変える場合などは、こちらのテストコードは非常に有用です。
参考にしてみてください。
TOPに戻る