Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHPUnit在Symfony2会话中失败_Php_Symfony_Phpunit - Fatal编程技术网

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