この記事では、PHP、Laravelのテスト(PHPUnit)で例外が投げられたかを判定する方法をご紹介します。
少しでも参考になれば幸いです。
バージョン情報
- PHP:7.3.26
 - Laravel:8.0
 
Sponsored Link
PHP・Laravelで例外が投げられたかを判定するテストを書く【PHPUnit】
結論から言うと、PHPUnitで例外が投げられたことを判定するには、expectException()メソッドを使います。
言葉だけではイメージしづらいと思うので、実際にコードの例を見ていきましょう。
今回実装したのは、1が渡ってきたら例外を返す簡単なプログラムです。
<?php
namespace App\Services;
use Exception;
class ExampleService
{
    public function execute($number)
    {
        if ($number == 1) {
            throw new Exception;
        }
    }
}
この場合、テストは以下のように書きます。
<?php
namespace Tests\Services;
use App\Services\ExampleService;
use Exception;
use Tests\TestCase;
class ExampleServiceTest extends TestCase
{
    /** @test */
    public function 例外が投げられたことを判定するテスト()
    {
        $this->expectException(Exception::class);
        (new ExampleService)->execute(1);
    }
}
実際にテストを動かしてみましょう。
通っていますね。例外が投げられたことをテストできました。
2を入れると例外が返ってこないのでテストが失敗することも確認できます。
<?php
namespace Tests\Services;
use App\Services\ExampleService;
use Exception;
use Tests\TestCase;
class ExampleServiceTest extends TestCase
{
    /** @test */
    public function 例外が投げられたことを判定するテスト()
    {
        $this->expectException(Exception::class);
        (new ExampleService)->execute(2);
    }
}
また、このような例外のテストを書く際のポイントは、テストしたいメソッドを呼び出すよりも先にexpectExceptionを書くことです。
なぜなら、例外が発生するとそこで処理が終了するため、テストがそれ以上実行されないからです。
試しに、expectExceptionを、メソッドを読んだ後に実装してみましょう。
<?php
namespace Tests\Services;
use App\Services\ExampleService;
use Exception;
use Tests\TestCase;
class ExampleServiceTest extends TestCase
{
    /** @test */
    public function 例外が投げられたことを判定するテスト()
    {
        (new ExampleService)->execute(1);
        $this->expectException(Exception::class);
    }
}
結果はこちら。
上手くテストを実行できずにエラーになっていることが確認できます。
PHPUnitで例外のテストをする方法まとめ
今回はPHP・LaravelでPHPUnitを使って例外のテストをする方法を解説しました。
PHPUnitでは、expectExceptionメソッドを利用することで例外のテストをすることが可能です。
今回は以上となります。
この記事が少しでも課題解決の一助となっていれば幸いです。
	
	
	
	
