【PHPUnit + Laravel】認証できていない状態をテストするとUnauthenticatedエラーが発生する場合の対策


概要

ログインしていない場合に401ステータスが返ってくることをテストすると以下のエラーが発生したので対応法を紹介する

エラーログ

Illuminate\Auth\AuthenticationException : Unauthenticated.

テストコード

UserControllerTest.php
<?php

class PartnerControllerTest extends TestCase
{
    use RefreshDatabase;

    public const INDEX_PATH = 'admin/users';
    
    protected function setUp(): void
    {
        parent::setUp();

        // POST時に419エラーが発生するのでCSRFミドルウェアを無効にする
        $this->withoutMiddleware([VerifyCsrfToken::class]);

        // 詳細エラー取得
        $this->withoutExceptionHandling();

        // テストデータを作成
        $this->authUser = factory(User::class)->create();
    }

    public function test_NG_ログインしていない場合はアクセスできない()
    {
        $response = $this->get(self::INDEX_PATH);
        $response->assertStatus(401);
    }
}

対応方法

以下を追加する

$this->expectException(AuthenticationException::class);
UserControllerTest.php
<?php

class PartnerControllerTest extends TestCase
{
    use RefreshDatabase;

    public const INDEX_PATH = 'admin/users';
    
    protected function setUp(): void
    {
        parent::setUp();

        // POST時に419エラーが発生するのでCSRFミドルウェアを無効にする
        $this->withoutMiddleware([VerifyCsrfToken::class]);

        // 詳細エラー取得
        $this->withoutExceptionHandling();

        // テストデータを作成
        $this->authUser = factory(User::class)->create();
    }

    public function test_NG_ログインしていない場合はアクセスできない()
    {
        $this->expectException(AuthenticationException::class);
        $response = $this->get(self::INDEX_PATH);
        $response->assertStatus(401);
    }
}