🙆

【Laravel】assertStatusの中身を見てみる

2021/05/09に公開

環境

Laravel 8.26.1
PHP 8.0.2
PHPUnit 9.5.2

はじめに

LaravelでPHPUnitを用いてテストをする時によく使うassertStatusメソッドがLaravelでどのように実装されているか確認してみた。

assertStatusメソッド

assertStatusメソッドは「/Illuminate/Testing/TestResponse.php」に定義されている。

    /**
     * Assert that the response has the given status code.
     *
     * @param  int  $status
     * @return $this
     */
    public function assertStatus($status)
    {
        $actual = $this->getStatusCode(); // ①

        PHPUnit::assertSame(
            $actual, $status,
            "Expected status code {$status} but received {$actual}."
        ); // ②

        return $this;
    }

①でレスポンスのステータスコードを取得。
②でPHPUnitのアサーションメソッドであるassertSameを使って、①で取得したステータスコードと引数で受け取ったステータスコードが同じ型かつ同じ値かチェック。
同じ型・値でない場合、"Expected ..."のエラーメッセージを返す。

使用例

公式ドキュメントから抜粋。

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * 基本的なテスト例
     *
     * @return void
     */
    public function test_a_basic_request()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

test_a_basic_requestメソッドは/にアクセスしたとき、200ステータスが返ってくることを確認している。
テストを実行して正しく200が返ってきた場合は下記のように表示される。

PHPUnit 9.5.2 by Sebastian Bergmann and contributors.

..                                                                  2 / 2 (100%)

Time: 00:01.248, Memory: 28.00 MB

一方で、200以外のステータスが返ってきた場合、下記のように表示される。
assertStatusメソッドのエラーメッセージが表示されていることが分かる。

例)api.phpにルートを定義をしていない場合

PHPUnit 9.5.2 by Sebastian Bergmann and contributors.

F.                                                                  2 / 2 (100%)

Time: 00:01.101, Memory: 28.00 MB

There was 1 failure:

1) Tests\Feature\ExampleTest::test_a_basic_request
Expected status code 200 but received 404. // エラーメッセージ
Failed asserting that 200 is identical to 404.

Discussion