Edited at

Laravelのテストでcookieを設定したはずなのに取得できない場合

More than 1 year has passed since last update.

Controllerのテストで設定されたcookieの値で処理を分岐させる箇所があったので、

cookieを設定したものの、Controller側ではnullになってしまって取得できなくてハマってしまったので誰かのためにいつか役に立つことを願いつつメモします。


環境

名前
バージョン

PHP
7.2.6

Laravel
5.5.40


事象

cookieが取得できなかったときのコードは以下です。


ExampleControllerTest.php

    public function testIndex()

{
$response = $this->call(
'GET',
'/',
[],
['cookie-name' => 'cookie-value']
);
$response->assertStatus(200);
}


ExampleController.php

    public function index(Request $request)

{
$cookie = \Cookie::get('cookie-name');

if (is_null($cookie)) {
dump('cookieはnullです。');
return response('', 400);
}

return response('', 200);
}


テストを実行するとcookieがnullになっています。

どうすればいいのでしょうか?


解決法

Laravelはミドルウェアでcookieを自動的に暗号化しますので、

テストのときだけ暗号化を無効にします。


ExampleControllerTest.php

    public function testIndex()

{
// テストでcookieが利用できるように暗号化対象から除外
$this->disableCookiesEncryption(['cookie-name']);

$response = $this->call(
'GET',
'/',
[],
['cookie-name' => 'cookie-value']
);
$response->assertStatus(200);
}

protected function disableCookiesEncryption($cookies)
{
$this->app->resolving(App\Http\Middleware\EncryptCookies::class, function ($object) use ($cookies) {
$object->disableFor($cookies);
});

return $this;
}


これでController側でcookieが取得できるようになります。


参考

[5.2] Cookies sent in test are not present in request.