LaravelのUnitTestでログインしようとして302になったときの対応方法

  • URLをコピーしました!

LaravelのUnitTestで、ルートのテストをする際に、ログインをしようとして302エラーになったときは、CSRF対策が効いていることが多いです。
もし、以下のようなソースコードを書いた初回にエラーが発生してこの記事を見ている場合は、UnitTestの実行時にCSRFをオフにするように設定すると回避できると思います。

以下、サンプルコードです。

<?php

namespace Tests\Feature\Admin;

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use DB;

class UserControllerTest extends TestCase
{
    use RefreshDatabase;

    /**
     * マイページ表示
     *
     * @return void
     */
    public function testMypage()
    {
        $this->seed();

        // ログイン画面
        $response = $this->get(route('user.login'));
        $response->assertStatus(200);

        // ログイン認証
        $response = $this->post(route('user.login.post'), ['username' => 'aaaa', 'password' => 'apass']);
        $response->assertRedirect(route('mypage')); //ログインが成功してmypageに遷移したことをチェック

        // ~~以下略~~

このようなテストを行ったときに、リダイレクト先がlogoutだったり、login画面だったりと、意図しないリダイレクト先の場合は、CSRF対策をオフにします。

laravel\app\Http\Middleware\VerifyCsrfToken.php を以下のように変更します。

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        //
    ];

    public function handle($request, \Closure $next)
    {
        if(env('APP_ENV') !== 'testing')
        {
            return parent::handle($request, $next);
        }

        return $next($request);
    }
}

もう1点、laravel\phpunit.xml<server name="APP_ENV" value="testing"/> に変更します。
このとき、laravel\.env.testing ファイルが必要です。

laravel\.env.testing ファイルは、基本的には .env のコピーでOKなのですが、できれば UnitTest 実行時専用のデータベースがあると、 php artisan test 実行時にデータベースのデータが毎回リフレッシュされてしまうようなことがないので、便利です。
開発環境の構築を担当している方に、Dockerでテスト用のデータベースを準備してほしいと依頼してみると良いと思います。

ツチノコテクノロジーに開発・保守を発注しませんか?

Laravel・Flutterの開発・保守をツチノコテクノロジーに発注しませんか?

まずはZOOMで打ち合わせ

お申し込みはこちら

ツチノコテクノロジーでは一緒に働く仲間を募集しています!

完全リモートで働きたい方へ!

詳しくは以下をご覧ください。

ツチノコテクノロジー採用サイト

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

yfukudaのアバター yfukuda 取締役・システムエンジニア

ツチノコテックアカデミアの記事は、社内で誰かが質問してくれたことに回答したときに、ついでに記載しています!(^^)/
みんなの悩みを共有すれば、きっと誰かの役に立つと信じて更新しています!

目次