You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel测试中使GET请求使用初始创建的Session ID

解决Laravel测试中GET请求复用指定Session ID的问题

在你的测试代码里,session()->getId()获取的是当前测试进程的会话ID,但调用$this->get()发起请求时,框架会创建全新的会话上下文,导致后端index方法拿到的Session ID和之前创建消息时的不一致,因此查不到对应的聊天记录,断言失败。

下面是两种可行的解决方法:

方法一:手动携带Session Cookie发起请求

Laravel的测试请求支持通过withCookie()方法传入Session Cookie,将之前获取的$sessionId作为Cookie值传递,Cookie的键对应框架配置的Session Cookie名称(默认是laravel_session,可在config/session.php的'cookie'项查看)。

修改后的测试代码:

public function test_chatbot_messages_page_has_non_empty_chat(): void
{
    $sessionId = session()->getId();

    ChatbotMessage::create([
        'session_id' => $sessionId,
        'content' => 'Hello',
        'role' => 'You',
    ]);

    ChatbotMessage::create([
        'session_id' => $sessionId,
        'content' => 'Hi there',
        'role' => 'Bot',
    ]);

    // 携带Session Cookie发起请求
    $response = $this->withCookie(config('session.cookie'), $sessionId)
                     ->get(route('chatbot-messages.index'));

    $response->assertSee('Hello');
}

方法二:复用测试进程的当前会话

无需单独存储Session ID,直接让请求复用当前测试进程的会话上下文,这样后端拿到的Session ID会和创建消息时的一致:

public function test_chatbot_messages_page_has_non_empty_chat(): void
{
    // 直接使用当前测试进程的会话ID创建消息
    ChatbotMessage::create([
        'session_id' => session()->getId(),
        'content' => 'Hello',
        'role' => 'You',
    ]);

    ChatbotMessage::create([
        'session_id' => session()->getId(),
        'content' => 'Hi there',
        'role' => 'Bot',
    ]);

    // 发起请求时复用当前会话
    $response = $this->get(route('chatbot-messages.index'));

    $response->assertSee('Hello');
}

原理说明

Laravel测试环境中,每次调用请求方法(如get、post)时,默认会初始化新的会话。要复用已有会话,要么通过Cookie传递Session ID,要么确保请求使用当前测试进程的会话实例。

内容的提问来源于stack exchange,提问作者Alphy Gacheru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:52:13