LaravelのNotificationに対してのテストコードを作成する方法
こんにちは。
ニシザワです。
本日はLaravelにおけるNotificationのテストコードについて書きたいと思います。
送信していることを中心に説明します。
Notificationのテストコードにフォーカスして書きます。
単純なクラスです。LaravelのNotificationを送るためだけの関節そうですね。
通知対象に通知されているかを確認するところです。
また、assertSentToの第3引数で送信内容のコールバックを設定できますので、そちらで送るべきデータの確認も入れることができます。
今回は簡単な例ですが、通知対象が複数あり条件によって対象を変える場合などは、こちらのテストコードは非常に有用です。
参考にしてみてください。
ニシザワです。
本日はLaravelにおけるNotificationのテストコードについて書きたいと思います。
送信していることを中心に説明します。
準備
環境
- ・Laravel5.8
- ・PHP7.3
説明しないこと
この記事では、phpunitの説明や実行方法,LaravelにおけるNotificationの実装方法は説明しません。Notificationのテストコードにフォーカスして書きます。
前提
ECサイトの決済が完了したときに送る領収書notificationを例に テストコードを作成します。ソースコード一覧
- /app/Services/InvoicePaidNotifier.php
- /app/Notifications/InvoicePaid.php
- /tests/Unit/ShippedNotificationTest
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
);
}
ポイントはassertSentToとassertNotSentToを使って 通知対象に通知されているかを確認するところです。
また、assertSentToの第3引数で送信内容のコールバックを設定できますので、そちらで送るべきデータの確認も入れることができます。
今回は簡単な例ですが、通知対象が複数あり条件によって対象を変える場合などは、こちらのテストコードは非常に有用です。
参考にしてみてください。