如何在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
相关产品推荐
相关产品推荐

