Laravel6 テストでCookieを書き込む方法

Laravel6
PHP Unit
テスト

Laravel6で、PHP Unitを利用したテスト中にCookieを利用したい場合、
少しテクニックが必要なようだ。

なお、以下に出てくるコードはすべて同じファイルの中に書いています。

LaravelではCookieは暗号化されている

この前提知識が大事です。
LaravelではCookie情報は暗号化されて書き込んでいるので、
テストの段階ではすでに暗号化されていて取得することができません。

Cookieの暗号化をデコード(復号化)する

まずデコードのコードを作ってあげます。
とあるQiitaの記事では、disableCookiesEncryptionというものが紹介されていますが、
Laravel6にはないようなので自作しないといけないみたいです。

なので自作します。

use Illuminate\Cookie\Middleware\EncryptCookies;

    /**
     * @param $name
     * @return $this
     */
    protected function disableCookiesEncryption($name)
    {
        $this->app->resolving(EncryptCookies::class,
            function ($object) use ($name)
            {
                $object->disableFor($name);
            });

        return $this;
    }

まずこいつ。disableCookiesEncryptionメソッドです。
こいつを使います。

Controllerテストを書く

public function コントローラーテスト()
{
    // 上で定義したdisableCookiesEncryptionメソッド
    $this->disableCookiesEncryption(['セットしたいクッキー名']);
		
    // Cookieの値もセットするために、callメソッドを使ってリクエストする
    $response = $this->call('「GET」 or 「POST」', 'URL', [], ['セットしたいクッキー名' => 'セットしたいクッキーの値']);
		
    $response->assertStatus(200);
}

こんな感じになります。

全体のコード

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\TestResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cookie;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Cookie\Middleware\EncryptCookies;

class SampleControllerTest extends TestCase
{
    /**
     * @param $name
     * @return $this
     */
    protected function disableCookiesEncryption($name)
    {
        $this->app->resolving(EncryptCookies::class,
            function ($object) use ($name)
            {
                $object->disableFor($name);
            });

        return $this;
    }
		
     /**
     * DocComment
     *
     * @test
     * @return void
     */
    public function コントローラーテスト()
    {
        // 上で定義したdisableCookiesEncryptionメソッド
        $this->disableCookiesEncryption(['セットしたいクッキー名']);
		
        // Cookieの値もセットするために、callメソッドを使ってリクエストする
        $response = $this->call('「GET」 or 「POST」', 'URL', [], ['セットしたいクッキー名' => 'セットしたいクッキーの値']);
        
        $response->assertStatus(200);
    }
}

参考にさせていただいた記事