私が読んだすべてのドキュメントと例から、エージェントを使用してスーパーテストでセッションを永続化できるはずです。
var app = require('../../../server'),
should = require('should'),
request = require('supertest'),
mongoose = require('mongoose'),
User = mongoose.model('User'),
_ = require('lodash');
var user = {
name: 'Sterling Archer',
email: 'duchess@isis.com',
password: 'guest'
};
describe('user.me', function() {
var url = '/user';
var agent = request.agent(app);
var new_user = new User(user);
new_user.save();
it('should return a user object', function(done) {
agent
.post('/signin')
.send(_.omit(user, 'name'))
.expect(200).end(function(err, res) {
console.log(res.headers['set-cookie']);
});
agent
.get(url)
.expect(200)
.end(function(err, res) {
should.not.exist(err);
console.log(res.headers['set-cookie']);
res.body.should.have.property('user');
res.body.user.should.have.properties('name', 'email');
done();
});
});
});
上記の各リクエストは同じエージェントを使用しているため、セッションは持続するはずです。ただし、そうではないようです。set-cookie ログからの出力は次のとおりです。
[ 'connect.sid=s%3AsFl1DQ4oOxC8MNAm79mnnr9q.gMkp8iEWtG8XlZZ2rkmheBwxKAyLyhixqDUOkYftwzA; Path=/; HttpOnly' ]
[ 'connect.sid=s%3AEzfbPyRGMff7yBXc9OAX3vGT.Ze2YoxZzuB6F6OwOk7mvrk96yPP2G4MGV%2Bt1rVjTyS8; Path=/; HttpOnly' ]
認証とセッションには、passport.js が使用されています。上記の connect.sid は両方のリクエストで一定であると予想されますが、各呼び出しで新しいセッションが作成されているように見えるため、エージェントは 2 回目の呼び出しでログインせず、ユーザー オブジェクトは返されません。
ブラウザでアプリを手動でテストすると、ログイン後も connect.sid が一定のままで、テストしている機能が機能します。
私はエージェントに何か悪いことをしているに違いありません。誰かがそれを見つけてくれることを願っています。それ以外の場合は、問題をデバッグする方法についての提案をいただければ幸いです。