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 标志,我的单元测试会抛出一个 headers already sent 错误并且全部失败。有了它,我的测试运行良好。

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

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

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

24) Yumilicious\UnitTests\Validator\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 /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)并且旧方法正在被弃用。

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

4

3 回答 3

4

为了进行测试,您需要session.storage用以下实例替换服务MockArraySessionStorage

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

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

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

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

于 2012-10-02T17:55:43.793 回答
3

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

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

在 config_test.yml 中设置

于 2013-05-14T13:01:53.783 回答
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.');
   }
   */

该解决方案使测试保持“绿色”,并且从外观上看,应用程序会话功能保持不变。

于 2013-05-14T11:58:43.690 回答