Laravel

PHP・Laravelで例外が投げられたかを判定するテストを書く【PHPUnit】

PHP・Laravelで例外が投げられたかを判定するテストを書く【PHPUnit】

この記事では、PHP、Laravelのテスト(PHPUnit)で例外が投げられたかを判定する方法をご紹介します。

少しでも参考になれば幸いです。

バージョン情報
  • PHP:7.3.26
  • Laravel:8.0

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メソッドを利用することで例外のテストをすることが可能です。

 

今回は以上となります。

この記事が少しでも課題解決の一助となっていれば幸いです。

COMMENT

メールアドレスが公開されることはありません。

CAPTCHA