0

sessionIdが与えられた場合、エクスプレスセッションオブジェクトを取得する必要があります。その後、このセッションオブジェクトを編集して、セッションストアのセッションを自動的に更新できるようにしたいと思います。

Session = require('express').session.Session;

_testSession: (sStore, sId) ->
  console.log 'called _testSession with session id: ' + sId

  sStore.get sId, (error, session) ->
    expressSession = new Session 
        sessionId: sId
        sessionStore: sStore
        , session
    expressSession.foo = 17

    console.log 'set expressSession.foo to: ' + expressSession.foo

    setTimeout (()->
        sStore.get sId, (error, session) ->
            console.log 'foo = ' + session.foo
        ), 1000

ただし、このテストを実行すると、次の出力が得られます。

called _testSession with session id: YaFLcq3eSvoNuwnLS1T1ntrC.3UJMuQ5So6lYRWLDgIRx4Vk/Ab1qH65zV9IwMqoMcR8
set expressSession.foo to: 17
foo = undefined

誰かがここで何が起こっているのか分かりますか?... :(

====編集====

save()も呼び出してみたので、コードは次のようになります。

console.log 'set expressSession.foo to: ' + expressSession.foo

expressSession.save (error) ->
    console.log 'error: ' + error
    setTimeout (()->
        sStore.get sId, (error, session) ->
            console.log 'foo = ' + session.foo
        ), 1000

そして同じ出力を得ました:(

====編集====

気にしないでください、save()は機能します。sessionIdはsessionID.../facepalmである必要があります。

4

1 に答える 1

1

@robertj が言ったように、保存するように指示しない限り、おそらくオブジェクトは保存されません。

しかし、もっと重要なことは、特にセッション オブジェクト自体 (つまり、接続のセッション用ミドルウェア) をテストするつもりでない限り、何をしても意味がありません。

これ以上の文脈なしに言うのは難しいですが、ここでのあなたの目的は、いくつかのルートハンドラーまたはミドルウェアが何かをセッションに入れることを確認することだと思いますよね? その場合は、単独でテストしてください。例えば

var should = require('should');

var req = { session : {}, /*any other bits of req you expect your handler to need */};
var res = { /* whatever functions your handler needs off the response */ };

yourHandler(req, res);
req.session.foo.should.be.ok; // not null; alternatively test equality or whatever

それは「単体テスト」のためです。統合テスト (db とビューなどの連携を確認したい場合) を行っている場合でも、セッションをチェックする必要はありません。

于 2012-09-06T16:26:25.043 に答える