📚

Mailableでのメール送信の結合テストを書く(Laravel)

2021/05/19に公開

前回、メール送信のロジックを作成しました。

今回はそのメール送信ロジックの結合テストを書いていきたいと思います。
具体的にはお問い合わせAPIを叩いて、実際にメールが送信されるかどうかのテストをしていきます。

前回のメール送信を見ていない方はそちらを見ながら、結合テストの書き方を参考にしてみてください。

メール送信の結合テストを書く

1. 結合テストを書くファイルを作成する

僕は機能ごとにファイルを分けるのが好みなので、 SendContactMailTest という名前でテストファイルを作成します。

php artisan make:test SendContactMailTest 

すると、 tests/Feature/SendContactMailTest.php が作成されました。

2. テストを書く

<?php

namespace Tests\Feature;

use App\Mail\ContactMail;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Support\Facades\Mail;
use Tests\TestCase;

class SendContactMailTest extends TestCase
{
    use WithFaker;

    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function testSendContactMail()
    {
        Mail::fake();

        // ユーザーを作成して、認証状態にする
        $user = User::factory()->create();
        $this->actingAs($user);

        // APIリクエストを送る(WithFakerをインポートしているので、fakerでランダム文字列を生成できます)
        $response = $this->post('/api/contact', ['content' => $this->faker->sentence()]);
        $response->assertStatus(200);

        // $userのメールアドレス宛に送信されていることをテストする
        Mail::assertSent(
            ContactMail::class,
            function ($mail) use ($user) {
                return $mail->to[0]['address'] === $user->email;
            }
        );
    }
}

3. テストを実行する

phpunitでテストを実行してみます。

$ vendor/bin/phpunit tests/Feature/SendContactMailTest.php
PHPUnit 9.5.4 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 00:00.532, Memory: 24.00 MB

OK (1 test, 2 assertions)

テスト通りました!

終わりに

メール送信のテストを作成するのはとても簡単でした。
テストを書くと今後のリファクタリングや機能改修・機能追加が安心安全になるので、
今後メール送信のロジックを書くときに、ぜひテストも書いてみてくださいね!

Discussion