Symfony3.4功能测试设置Session数据后取值为null的问题
解决Symfony 3.4 + LiipFunctionalTestBundle 1.8测试中Session设置不生效的问题
这个问题我太熟悉了!核心原因其实很简单:你直接从容器获取的Session对象,和测试客户端(Client)发起请求时使用的Session不是同一个实例。当你调用$this->getClient()->request()的时候,客户端会重新初始化自己的Session上下文,导致你之前设置的test值根本没被带到请求里,Action自然拿到null。
给你几个靠谱的解决办法:
方法一:直接操作客户端的Session实例
这是最直接有效的方式,所有Session操作都基于测试客户端提供的Session:
$client = $this->getClient(); // 直接通过客户端获取Session并设置值 $client->getSession()->set('test', 2); // 再发起请求 $client->request(Request::METHOD_GET, $routing);
$client->getSession()是Symfony Client和LiipBundle封装的快捷方法,拿到的就是请求会用到的那个Session实例,设置后直接生效。
方法二:手动保存Session(必要时)
如果你的场景比较特殊,比如需要提前初始化Session并确保数据被持久化,可以手动调用save():
$client = $this->getClient(); $session = $client->getSession(); $session->set('test', 2); $session->save(); // 确保Session数据被保存 $client->request(Request::METHOD_GET, $routing);
检查测试环境的Session配置
另外别忘了确认config_test.yml里的Session配置是否正确,测试环境推荐用mock存储,避免干扰真实Session:
framework: test: ~ session: storage_id: session.storage.mock_file handler_id: ~
session.storage.mock_file是Symfony专为测试环境设计的Session存储,能保证Session在测试请求中正确传递,不会出现数据丢失的情况。
最后再提醒一句:测试中所有和Session相关的操作,都要通过$client->getSession()来做,别再直接从容器里拿了,那样根本不会关联到请求上下文哦!
内容的提问来源于stack exchange,提问作者shuba.ivan
相关产品推荐
相关产品推荐

