【问题标题】:Symfony 2 SessionCsrfProvider & PHPUnit testingSymfony 2 SessionCsrfProvider & PHP单元测试
【发布时间】:2013-06-21 04:24:15
【问题描述】:

编辑

其实是我自己回答的,很简单:

$session = $this->getMock(
  '\Symfony\Component\HttpFoundation\Session\Session',
  array(),
  array(),
  '',
  false // don't call constructor
);
$container->register('session', $session);

在 phpunit 引导文件中模拟会话对象。

++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++

在我看来,要正确测试它是不可能的。

我正在使用 Symfony 2 独立组件 - 不使用 FrameworkBundle 等。我有一个控制器,它反过来创建一个表单,然后(尝试)将 Csrf 扩展添加到表单构建器。

但是,传入一个会话对象只会给我:

RuntimeException: Failed to start the session because headers have already been sent.

一些产生这个的代码:

$session = $this->container->get('session') // instance of Symfony\Component\HttpFoundation\Session\Session
$form_obj = new MyForm(); // extends AbstractType
$secret   = $form_obj->getName(); // something random
$form_obj->addExtension(new CsrfExtension(new SessionCsrfProvider($session, $secret)));

好的,所以会话无法启动,因为 PHPUnit 先发送输出。推杆 session_start();

在引导文件的顶部没有帮助或工作。

RuntimeException: Failed to start the session because a session has already been started

无论如何,这是一个软糖修复,因为无论如何您都不会在 2 个不同的地方开始会话。

接下来,我尝试按照以下说明注册模拟会话对象:http://symfony.com/doc/master/components/http_foundation/session_testing.html

但是,遗憾的是 SessionCsrfProvider 接口需要:

Argument 1 passed to 
Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider::__construct() 
must be an instance of Symfony\Component\HttpFoundation\Session\Session, 
instance of 
Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage given

所以...我实际上不能在任何测试代码中使用 SessionCsrfProvider,除非我将会话作为 PHPUnit 模拟提供给它...但是那将需要我更改代码的设计以注入会话对象作为调用该 addExtension() 方法的某个方法放入构造函数或参数中。目前,上面添加扩展的代码被包装在一个函数本身中,所以这意味着它需要手动传递一个会话对象,我真的不想介绍。

有什么想法吗?

【问题讨论】:

    标签: symfony phpunit


    【解决方案1】:

    我知道我对此有点晚了,但另一种更好的方法是使用 Symfonys MockArraySessionStorage。

    $session = new Session(new MockArraySessionStorage());
    
    $csrfProvider = new SessionCsrfProvider($session, $secret);
    

    【讨论】:

      猜你喜欢
      • 2013-05-22
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 2012-02-16
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      相关资源
      最近更新 更多