Posted at

Laravel でモックを使ったメール送信のテストが簡単だった

More than 1 year has passed since last update.


はじめに

モックを使ったメール送信のテストが意外と簡単にできたのでメモ。

アサートメソッドが充実していて、キューを使ったメール送信のテストも簡単にできてしまう。


環境

PHP 7.1

Laravel 5.5


サンプル


MailTest.php

class MailTest extends TestCase

{
public function testMailSend()
{
Mail::fake();

$email = 'test@gmail.com';

// 任意の実際のリクエスト処理
$this->put(
"test/mail",
[
'mail_to' => $email,
]
);

// 1回送信されたことをアサート
Mail::assertQueued(MailBuilder::class, 1);

// メールが指定したユーザーに送信されていることをアサート
Mail::assertQueued(
MailBuilder::class,
function ($mail) use ($email) {
return $mail->to[0]['address'] === $email;
}
);
}
}



解説



  • Mail::fake() で実際にメールが送信されるのを防ぐことができる


  • MailBuilderphp artisan make:mail MailBuilder で生成した任意の Mailable クラス

  • メール送信の前にキューに入れているので assertQueued を使用しているが普通に送信するなら assertSent を使う


あとがき

当たり前だが、ユーザーにメールが到達しているかどうかまではテストできないので、処理がメール送信まで到達していることまでが担保できる範囲。