PHPUnit在Symfony2会话中失败
我在尝试对实现会话的控制器方法运行基于控制器的单元测试时遇到了一个问题 在这种情况下,以下是控制器方法:PHPUnit在Symfony2会话中失败,php,symfony,phpunit,Php,Symfony,Phpunit,我在尝试对实现会话的控制器方法运行基于控制器的单元测试时遇到了一个问题 在这种情况下,以下是控制器方法: /** * @Route("/api/logout") */ public function logoutAction() { $session = new Session(); $session->clear(); return $this->render('PassportApiBundle:Login:logout.html.twig'); }
/**
* @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());
}
产生的错误:
无法启动会话,因为已发送标头。(500内部服务器错误)
我试着在
$this->app['session.test']=true代码>进入测试,但仍然无法进入。是否有人试图解决这样的问题,对使用会话的控制器进行单元测试?首先,您应该使用容器中的会话对象。因此,您的操作应该更像:
/**
* @Route("/api/logout")
*/
public function logoutAction()
{
$session = $this->get('session');
$session->clear();
return $this->render('PassportApiBundle:Login:logout.html.twig');
}
然后在测试中,您可以将服务注入“客户机容器”。因此:
有了这段代码,您可以使用会话服务做任何您想做的事情。但你必须意识到两件事:
- 此模拟将仅为一个请求设置(如果您希望在下一个请求中使用它,则应再次设置)。这是因为客户端重新启动内核并在每个请求之间重建容器
- Symfony 2.1中的会话处理与Symfony 2没有什么不同
编辑:
我在这里添加了一个断言来完成塞浦路斯人的回答
正如斯文所解释的,在查看symfony的医生时,
必须使用MockFileSessionStorage对象作为第一个构造函数参数来实例化模拟会话
您需要使用:
use Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage;
代码应为:
$sessionMock = $this->getMockBuilder('Symfony\Component\HttpFoundation\Session\Session')
->setMethods(array('clear'))
->disableOriginalConstructor()
->setConstructorArgs(array(new MockFileSessionStorage()))
->getMock();
在我的情况下,这就足够了
framework:
session:
storage_id: session.storage.mock_file
在配置测试.yml
中。YMMV,我不太清楚我实际上在做什么,但它对我很有用。如果你看一下会话的测试
类(),看起来你应该注入MockArraySessionStorage
的实例以避免启动会话。但是,我设置了这些行,如何将其传递给$client=static::createClient()代码>?单独添加这些行会导致相同的错误。是的,问题是您的控制器不提供任何注入。new
操作没有参数,而且无论如何都无法通过测试。但我认为symfony2应该能够使它的DI框架在这方面可用。例如,您读过这样的内容吗:另外,Symphony文档建议您这样进入会话:$Session=$this->getRequest()->getSession()代码>-这可以使PHPUnit引导使用模拟会话ObjectsHanks。更改为$session=$this->get('session')
使其工作正常。我不知道为什么文档告诉我使用newsession()
。。。默认情况下,我在config_test.yml
中已经有了该设置,但我得到了致命错误:在$session->get(“…”)行调用非对象的成员函数get()代码>其中$session
来自$session=$this->container->get('request')->getSession()代码>可能有更好的方法esp使用较新版本的Symfony2,但我仍然需要找出方法-
framework:
session:
storage_id: session.storage.mock_file