加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 17:42:38 所属栏目:PHP教程 来源:网络整理
导读:我正在使用单元测试在Silex中创建一个应用程序. 运行单元测试对常规会话处理程序工作正常: $app-register(new SilexProviderSessionServiceProvider(),array( 'session.storage.options' = array( 'cookie_lifetime' = 1209600,// 2 weeks ),)); 并在我的
我正在使用单元测试在Silex中创建一个应用程序.

运行单元测试对常规会话处理程序工作正常:

$app->register(new SilexProviderSessionServiceProvider(),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)
YumiliciousUnitTestsValidatorPersonAccountTest::setConstraintsPassesWithMinimumAttributes
RuntimeException: Failed to start the session because headers have
already been sent.

/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)并且旧方法已被弃用.

让我的单元测试工作的任何建议都很棒.

解决方法

要进行测试,您需要使用MockArraySessionStorage实例替换session.storage服务:

use SymfonyComponentHttpFoundationSessionStorageMockArraySessionStorage;

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读