首页 文章

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

提问于
浏览
4

我正在使用单元测试在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 \ UnitTests \ Validator \ PersonAccountTest :: setConstraintsPassesWithMinimumAttributes RuntimeException:由于已经发送了 Headers ,因此无法启动会话 . /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 / webroot / yumilicious / vendor / 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 回答

  • 3

    对于测试,您需要使用 MockArraySessionStorage 的实例替换 session.storage 服务:

    use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
    
    $app['session.storage'] = new MockArraySessionStorage();
    

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

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

  • 4

    我也有这种情况发生,如果我没有误解我通过让我的单元测试通过不同的环境运行来修复,具有

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

    在config_test.yml中设置

  • 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.');
       }
       */
    

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

相关问题