👻
Laravelのphpunitで419エラーが発生した場合の対処法
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のミドルウェアを無視してくれます。
【参考サイト】
Discussion