WEBOPIXEL

Laravelでログ出力をユニットテストする方法

Laravelロゴ

Posted: 2022.03.31 / Category: PHP / Tag: 

Laravelでテストコードを書いていると、ログ出力もアサートしたいということがありますよね。
ということでログ出力をユニットテストする方法をご紹介します。

Sponsored Link

使用するバージョンです。(結構古いバージョンでも大丈夫だと思います。)
mockeryはデフォルトで入っています。
Laravel 9
mockery 1.4

ログ出力実装

例えばこんな感じにコントローラーにログが仕込んであるとします。
ログはファサードで出力する必要があります。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

class HogeController extends Controller
{
	public function index(Request $request)
	{
        Log::info('開始');

        $num = intval($request->num);

        if (10 < $num) {
            Log::error('大きすぎ!');
        }

        Log::info('終了');

        return response()->json(['num' => $num]);
	}
}

ログ出力のテスト

テスト開始時にファサードのspyを実行しておきます。
spyを使うことでメソッドの実行をテストすることができます。

shouldHaveReceived メソッドが実行することをテスト
shouldNotHaveReceived メソッドが実行されないことをテスト

メソッドの引数もテストすることができます。
shouldHaveReceivedは第二引数に指定するか、withをメソッドチェーンで繋げます。
shouldNotHaveReceivedは第二引数の指定のみです。

先ほど作成したコントローラーのテストコードを書いてみましょう。

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Support\Facades\Log;

class HogeTest extends TestCase
{
	/**
	 * @test
	 */
	public function ログテスト()
	{
		$spy = Log::spy();

		$this->getJson('/hoge?num=10');

        $spy->shouldHaveReceived('info', ['開始']);
        $spy->shouldNotHaveReceived('error', ['大きすぎ!']);
        $spy->shouldHaveReceived('info')->with('終了');
	}
}

spyはMockeryの機能で、その他にもいろいろ機能がありますので詳しくはドキュメントを確認ください。

Mockery Docs