Symfony 6中使用Session进行控制器功能测试(Session服务已弃用)
Symfony 6 功能测试中设置会话数据的方法
在Symfony 6里,虽然直接从容器获取session服务的方式被弃用,但在功能测试中依然可以轻松准备带指定数据的会话,核心是使用测试客户端的getSession()方法,它会返回当前请求关联的SessionInterface实例,和控制器中Request->getSession()拿到的是同一个上下文。
基础用法:设置普通会话数据
在发送请求前,先获取会话并设置测试数据,示例代码如下:
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class YourControllerTest extends WebTestCase { public function testSessionDataInController(): void { $client = static::createClient(); // 获取会话实例并设置测试数据 $session = $client->getSession(); $session->set('user_preference', 'dark_mode'); $session->set('cart_items', ['item_1', 'item_2']); // 发送请求,会话数据会自动随请求传递到控制器 $client->request('GET', '/user/profile'); // 执行断言,比如验证控制器是否正确使用了会话数据 $this->assertResponseIsSuccessful(); $this->assertSelectorTextContains('.preference', 'dark_mode'); } }
进阶用法:模拟认证会话
如果需要测试需要用户登录的接口,可以通过会话设置认证token,示例:
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; class ProtectedControllerTest extends WebTestCase { public function testProtectedRouteWithAuthenticatedUser(): void { $client = static::createClient(); $session = $client->getSession(); // 创建测试用的认证token(这里的'main'是你的防火墙名称) $token = new UsernamePasswordToken( 'test_user', // 用户名或用户对象 null, 'main', ['ROLE_USER'] // 用户角色 ); // 将token存入会话,Symfony的安全组件会自动识别 $session->set('_security_main', serialize($token)); $session->save(); // 手动保存确保数据写入 // 访问需要登录的路由 $client->request('GET', '/dashboard'); // 断言请求成功,且页面显示用户相关内容 $this->assertResponseIsSuccessful(); $this->assertSelectorTextContains('.welcome', 'Hello test_user'); } }
注意事项
- 不需要再从容器调用
get('session'),$client->getSession()已经是官方推荐的测试会话操作方式 - 会话数据会自动关联到后续的请求,除非你调用
$session->clear()清空 - 如果修改会话后需要立即生效,可调用
$session->save()确保数据持久化
内容的提问来源于stack exchange,提问作者Xavi Montero
相关产品推荐
相关产品推荐

