【发布时间】: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() 方法的某个方法放入构造函数或参数中。目前,上面添加扩展的代码被包装在一个函数本身中,所以这意味着它需要手动传递一个会话对象,我真的不想介绍。
有什么想法吗?
【问题讨论】: