👻

Laravelのphpunitで419エラーが発生した場合の対処法

2021/11/15に公開

Laravelのユニットとテストで419エラーが出てちょっと焦りました💦
419エラーの理由は、CSRFトークンが一致しませんエラーですね。

ただユニットテストの場合はCSRFとか関係ないので、無視したいのです。
もちろん本番環境や開発環境ではCSRF対策は重要なので残しておきたいです。

対策1: withoutMiddlewareを使う

先に言っておくと、僕はwithoutMiddlewareは推奨しません。
なぜならミドルウェアが全部無視されてしまうからです。

自分で作ったミドルウェアもauthミドルウェアも全部無視されてしまうので、実際の環境と差が出てきます。
テストはできるだけ実際のコードと同じものでテストしたいですよね。

ただユニットテストで419エラーが出た場合の対処法をネットで調べると、結構この「withouMiddlewareを使用すること」が出てきます。何でだろう。。

僕は推奨しないので「withoutMiddleware」の使い方は詳しくは説明しません。

対策2. テスト環境の時のみCSRFミドルウェアを無効にする

僕はこちらの方をお勧めします。

CSRF対策は「App\Http\Middleware\VerifyCsrfToken」で実装されていて、
テスト環境の時はCSRF対策は無視するというのが対策として一番良いと思います。

VerifyCsrfToken.php を開き下記のコードにします。

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

    return $next($request);
}

そして、phpunit.xml にenv=testingを追記します。

<php>
    <!--追記する -->
    <server name="APP_ENV" value="testing"/>
</php>

これでテストの際はCSRFのミドルウェアを無視してくれます。

【参考サイト】
https://stackoverflow.com/questions/46325790/phpunit-expected-status-code-200-but-received-419-with-laravel/59352800#59352800

Discussion