📚
Mailableでのメール送信の結合テストを書く(Laravel)
前回、メール送信のロジックを作成しました。
今回はそのメール送信ロジックの結合テストを書いていきたいと思います。
具体的にはお問い合わせ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