使用Symfony的flashBag会话进行单元测试

时间:2012-09-28 16:18:56

标签: symfony phpunit silex

我正在使用单元测试在Silex中创建一个应用程序。

运行单元测试对常规会话处理程序运行良好:

$app->register(new Silex\Provider\SessionServiceProvider(), array(
    'session.storage.options' => array(
        'cookie_lifetime' => 1209600, // 2 weeks
    ),
));

并在我的单元测试中设置此标志:

$this->app['session.test'] = true;

如果我没有设置session.test标志,我的单元测试会抛出已发送的标头错误并且全部失败。有了它,我的测试运行良好。

问题是我正在尝试使用flashBag功能(会话信息仅持续到第一次请求然后被删除):

$foo = $app['session']->getFlashBag()->all();

flashBag似乎不尊重session.test标志,并尝试发送标头,导致我的所有单元测试失败:

  

24)   Yumilicious \单元测试\验证\ PersonAccountTest :: setConstraintsPassesWithMinimumAttributes   RuntimeException:由于头文件而无法启动会话   已被发送。

     

/webroot/yumilicious/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php:142   /webroot/yumilicious/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php:262   /webroot/yumilicious/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Session.php:240   /webroot/yumilicious/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Session.php:250   /webroot/yumilicious/src/app.php:38   /webroot/yumilicious/tests/Yumilicious/UnitTests/Base.php:13   /webroot/yumilicious/vendor/silex/silex/src/Silex/WebTestCase.php:34   /webroot/yumilicious/vendor/EHER/PHPUnit/src/phpunit/phpunit.php:46   /根目录/ yumilicious /供应商/ EHER / PHPUnit的/ bin中/ PHPUnit的:5

我已将其缩小到这段代码:https://github.com/symfony/symfony/blob/master/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php#L259

具体来说,第262行。注释掉单行可以使我的测试正常工作,并且全部通过绿色。

我已经搜索了很多以使其工作,但我没有运气。我认为这是因为flashBag的内容是新的(https://github.com/symfony/symfony/blob/master/src/Symfony/Component/HttpFoundation/Session/Session.php#L305)并且旧方法已被弃用。

任何有关让我的单元测试工作的建议都会很棒。

3 个答案:

答案 0 :(得分:4)

要进行测试,您需要将session.storage服务替换为MockArraySessionStorage的实例:

use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;

$app['session.storage'] = new MockArraySessionStorage();

这是因为本地人尝试通过header发送cookie,这当然在测试环境中失败。

编辑:现在有一个session.test参数应该设置为true。这将自动使会话使用模拟存储。

答案 1 :(得分:3)

我也遇到过这种情况,如果我没有误会我通过不同的环境运行我的单元测试来修复

framework:
    test: ~
    session:
        storage_id: session.storage.mock_file

在config_test.yml中设置

答案 2 :(得分:0)

我今天遇到了类似的问题,临时解决方法是在

中注释掉代码块
\Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage
start()方法

中的

   /*
   if (ini_get('session.use_cookies')  && headers_sent()) {
       throw new \RuntimeException('Failed to start the session because headers have already been sent.');
   }
   */

此解决方案将测试保持为“绿色”,并从应用程序会话功能看起来如此。