単体テストを使用して 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: ヘッダーが既に送信されているため、セッションを開始できませんでした。
/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 行目です。その 1 行をコメント アウトすると、テストが適切に機能し、すべてが緑色に合格します。
これを機能させるためにかなり検索しましたが、運がありません。flashBag が新しくなり (https://github.com/symfony/symfony/blob/master/src/Symfony/Component/HttpFoundation/Session/Session.php#L305)、古いメソッドが廃止されたためだと思います。
単体テストを機能させるための提案は素晴らしいでしょう。