Laravelのテストでモック・スタブを使う方法を完全解説!MockeryとFacadeを初心者向けに理解しよう
生徒
「Laravelのテストで、外部の処理を使わずに確認する方法はありますか?」
先生
「あります。モックやスタブを使うと、本物の処理を動かさずにテストできます。」
生徒
「パソコンもまだ不慣れですが、理解できますか?」
先生
「日常の例えで説明するので、順番に読めば大丈夫です。」
1. Laravelのテストでなぜモックが必要なのか
Laravelのテストでは、アプリケーションが正しく動くかを自動で確認します。しかし、メール送信や外部サービスとの通信まで本当に実行すると、時間がかかったり失敗したりします。そこで使うのがモックやスタブです。これは「本物の代わり」を用意する仕組みです。電話の練習で本物の相手を呼ばず、練習用の人形を使うイメージに近いです。
2. モックとスタブの違いをやさしく理解
スタブは「決まった答えを返すだけの代役」です。一方、モックは「呼ばれた回数や使われ方まで確認する代役」です。初心者のうちは、スタブは簡単な置き換え、モックは動きをチェックするもの、と覚えれば十分です。LaravelではMockeryという仕組みを使って、これらを簡単に扱えます。
3. Mockeryとは何か
Mockeryは、テスト用の偽物オブジェクトを作るための道具です。Laravelには最初から組み込まれているため、特別な準備は不要です。Mockeryを使うことで「この処理が呼ばれたか」「決まった値を返しているか」を確認できます。難しい言葉に見えますが、テスト専用の便利な道具箱だと考えてください。
4. Mockeryを使った基本的なモックの書き方
ここでは、サービスクラスの処理をモックに置き換える例を見ます。本物の処理は動かさず、決まった結果だけを返します。
public function test_service_is_mocked()
{
$mock = Mockery::mock(App\Services\SampleService::class);
$mock->shouldReceive('execute')->once()->andReturn('OK');
$this->app->instance(App\Services\SampleService::class, $mock);
$this->assertEquals('OK', $mock->execute());
}
このコードではexecuteという処理が一回呼ばれ、「OK」が返ることを確認しています。
5. スタブとして使うシンプルな例
次は、呼ばれ方を細かく気にせず、結果だけを返すスタブの例です。初心者にはこちらの方が分かりやすいです。
public function test_stub_example()
{
$mock = Mockery::mock(App\Services\CalcService::class);
$mock->shouldReceive('sum')->andReturn(10);
$this->app->instance(App\Services\CalcService::class, $mock);
$this->assertSame(10, $mock->sum());
}
計算の中身は無視して、結果だけを確認しています。
6. Facadeを使ったモックの考え方
LaravelのFacadeは、便利な窓口のようなものです。ログやメール送信などを簡単に呼び出せます。テストでは、このFacadeもモックにできます。これにより、本当にメールを送らずに確認ができます。
use Illuminate\Support\Facades\Mail;
public function test_mail_is_sent()
{
Mail::fake();
Mail::to('test@example.com')->send(new SampleMail());
Mail::assertSent(SampleMail::class);
}
Mail::fakeは「本物の送信を止める」命令です。
7. モックとFacadeを組み合わせる注意点
モックやFacadeを使いすぎると、本当の動作が分かりにくくなることがあります。必要な部分だけを置き換えるのが大切です。初心者のうちは「外部とつながる処理だけをモックする」と覚えておくと失敗しにくいです。
8. モック・スタブを使うメリット
モックやスタブを使うことで、テストは速く安定します。ネット環境や外部サービスに左右されず、安心して確認できます。Laravelのテストとモックを組み合わせることで、安全で管理しやすいアプリケーションを作れるようになります。