🙌

Laravelでsession IDを固定したHTTPテスト

2022/06/01に公開

LaravelでControllerのテスト書くときに

$this->actingAs($user)->getJson(...)

みたいな感じでHTTPリクエストのテスト書くことがあるけど、セッションIDは固定されない。
セッションIDを意識することなんて基本的にはないんだけど、生きてると極稀にセッションIDを固定したいことがある。

そんなときはこんな感じで固定できるよ、という話。
※Cookie sessionの場合だから他の場合は適当に応用してください。

private array $sessionCookies = [];
protected function setUp(): void
{
    parent::setUp();
    $this->sessionCookies = [session()->getName() => session()->getId()];
}

public function 何らかのテストケース(): void {
    // ...
    $this->actingAs($user)
        ->withCredentials()
        ->withCookies($this->sessionCookies)
	->getJson(...)
    // ...
}

->withCookies() に対してsessionIDを含んだCookieの情報を渡すとそれが StartSession あたりで $request->cookies から展開されて拾われるので、それを利用してセッションIDを固定してる感じ。

->withCookies() をJSONリクエストで使う場合は ->withCredentials() が必要なので注意。

Discussion