Laravel测试中如何在不销毁原会话的前提下使用新会话发起请求?
在Laravel 5 HTTP测试中使用独立会话发起请求的方法
嘿,这个场景我太熟了!Laravel的HTTP测试默认会在同一个测试方法里共享会话上下文,要在中间插一个独立会话的请求又不破坏原会话,其实有两个好用的办法:
方法一:使用fresh()创建全新测试实例(推荐)
Laravel提供了fresh()方法,它会生成一个完全独立的测试客户端实例,和原实例的会话、Cookie等状态完全隔离,用完之后原实例的会话依然保持原样。
class HttpTest extends TestCase { public function testApplication() { // 第一个会话的请求:填充会话数据 $this->get('/action/fillSession'); // 用全新的独立会话发起请求,完全不影响原会话 $this->fresh()->get('/action/anotherSessionAction'); // 回到原会话,依然能读取第一个请求填充的数据 $this->get('/action/readSession'); } }
这个方法是官方推荐的,代码简洁且不易出错,从Laravel 5.1版本就已经支持了。
方法二:手动保存与恢复会话状态
如果你需要更精细地控制会话状态,可以手动保存原会话数据,重置会话完成独立请求后再恢复:
class HttpTest extends TestCase { public function testApplication() { // 第一步:执行第一个请求,填充会话 $this->get('/action/fillSession'); // 保存当前会话的所有数据 $originalSessionData = $this->app['session']->all(); // 第二步:重置会话,创建新的独立会话 $this->app['session']->flush(); // 清空当前会话数据 $this->app['session']->regenerate(); // 生成新的会话ID // 用新会话发起请求 $this->get('/action/anotherSessionAction'); // 第三步:恢复原会话数据 $this->app['session']->put($originalSessionData); // 继续使用原会话读取数据,完全不受中间请求影响 $this->get('/action/readSession'); } }
这种方法适合需要自定义会话操作的场景,但相比fresh()会繁琐一些,建议优先用第一种方法。
内容的提问来源于stack exchange,提问作者Finesse
相关产品推荐
相关产品推荐

