2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-06-21

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.

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?