はじめに
モックを使ったメール送信のテストが意外と簡単にできたのでメモ。
アサートメソッドが充実していて、キューを使ったメール送信のテストも簡単にできてしまう。
環境
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()
で実際にメールが送信されるのを防ぐことができる -
MailBuilder
はphp artisan make:mail MailBuilder
で生成した任意の Mailable クラス - メール送信の前にキューに入れているので
assertQueued
を使用しているが普通に送信するならassertSent
を使う
あとがき
当たり前だが、ユーザーにメールが到達しているかどうかまではテストできないので、処理がメール送信まで到達していることまでが担保できる範囲。