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が取得できるようになります。