gpt4 book ai didi

PHPUnit 因 Symfony2 session 而失败

转载 作者:可可西里 更新时间:2023-11-01 13:33:55 26 4
gpt4 key购买 nike

尝试在实现 session 的 Controller 方法上运行基于 Controller 的单元测试时遇到问题。

在这种情况下,这里是 Controller 方法:

/**
* @Route("/api/logout")
*/
public function logoutAction()
{
$session = new Session();
$session->clear();

return $this->render('PassportApiBundle:Login:logout.html.twig');
}

以及功能测试:

public function testLogout()
{
$client = static::createClient();
$crawler = $client->request('GET', '/api/logout');
$this->assertTrue($client->getResponse()->isSuccessful());
}

产生的错误:

Failed to start the session because headers have already been sent. (500 Internal Server Error)

我试过将 $this->app['session.test'] = true; 放入测试中,但还是不行。有没有人尝试解决这样的问题以对使用 session 的 Controller 进行单元测试?

最佳答案

首先你应该使用容器中的 session 对象。所以你的 Action 应该看起来更像:

/**
* @Route("/api/logout")
*/
public function logoutAction()
{
$session = $this->get('session');
$session->clear();

return $this->render('PassportApiBundle:Login:logout.html.twig');
}

然后在您的测试中,您可以将服务注入(inject)“客户端的容器”。所以:

public function testLogout()
{
$sessionMock = $this->getMockBuilder('Symfony\Component\HttpFoundation\Session')
->setMethods(array('clear'))
->disableOriginalConstructor()
->getMock();

// example assertion:
$sessionMock->expects($this->once())
->method('clear');

$client = static::createClient();
$container = $client->getContainer();
$container->set('session', $sessionMock);

$crawler = $client->request('GET', '/api/logout');
$this->assertTrue($client->getResponse()->isSuccessful());
}

使用此代码,您可以使用 session 服务做任何您想做的事情。但是您必须注意两件事:

  • 这个 mock 只会为一个请求设置(如果你想在下一个请求中使用它,你应该重新设置它)。这是因为客户端在每次请求之间重启内核并重建容器。
  • Symfony 2.1 中的 session 处理与 Symfony 2 略有不同

编辑:

我添加了一个断言

关于PHPUnit 因 Symfony2 session 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13693636/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com