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: ヘッダーが既に送信されているため、セッションを開始できませんでした。

/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)、古いメソッドが廃止されたためだと思います。

単体テストを機能させるための提案は素晴らしいでしょう。

4

3 に答える 3

4

session.storageテストのために、サービスを次のインスタンスに置き換える必要がありMockArraySessionStorageます。

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

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

これは、ネイティブの Cookie が Cookie を送信しようとするためheaderです。もちろん、テスト環境では失敗します。

編集: session.testtrue に設定する必要があるパラメーターが追加されました。これにより、セッションは自動的にモック ストレージを使用するようになります。

于 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 に答える