2

私が読んだすべてのドキュメントと例から、エージェントを使用してスーパーテストでセッションを永続化できるはずです。

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 が一定のままで、テストしている機能が機能します。

私はエージェントに何か悪いことをしているに違いありません。誰かがそれを見つけてくれることを願っています。それ以外の場合は、問題をデバッグする方法についての提案をいただければ幸いです。

4

2 に答える 2

1

Esteban の提案は、私がコードの非同期性を見落としていることを指摘していました。この例に戻ると、別のテストでログインすることの重要性を見逃していたことに気付きました。そうすることで私の問題は解決しました。

私は今、依存テストを作成していますが、私は夢中ではありません。

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'
};

var agent = request.agent(app);

describe('User Controller', function() {

before(function(done) {
    var new_user = new User(user);
    new_user.save();
    done();
});

describe('user.signin', function() {

    var url = '/signin';

    it('should signin and return a user object', function(done) {
        agent
            .post(url)
            .send(_.omit(user, 'name'))
            .expect(200)
            .end(function(err, res) {
                should.not.exist(err);
                res.body.should.have.property('user');
                res.body.user.should.have.properties('name', 'email');
                done();
            });
    });
});

describe('user.me', function() {

    var url = '/user';

    it('should return a user object', function(done) {
        agent
            .get(url)
            .expect(200)
            .end(function(err, res) {
                should.not.exist(err);
                res.body.should.have.property('user');
                res.body.user.should.have.properties('name', 'email');
                done();
            });
    });
});

after(function(done) {
    User.remove().exec();
    done();
});
});
于 2014-04-04T03:39:39.000 に答える