在mocha和supertest中坚持表达app会话

时间:2016-10-05 01:47:27

标签: node.js session express mocha supertest

我有一个明确的应用程序,由JWT处理身份验证,我只是在登录后将令牌存储在会话中。

req.session.JWToken = '<token>';

身份验证中间件如下所示:

this.use('(^\/admin')', expressJWT({
      secret: 'secret',
      getToken: function fromHeaderOrQuerystring (req) {
          if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
              return req.headers.authorization.split(' ')[1];
          } else if (req.query && req.query.token) {
              return req.query.token;
          } else if (req.session.JWToken) {
              return req.session.JWToken;
          }

          return null;
        }
  }).unless({path: ['/login', '/signup']}));

我需要使用mocha和supertest测试这个,我尝试了下面的代码:

var app = require('./../app');
var request = require('supertest');

describe('app', function() {
  var agent = request.agent(app);

  it('should signin', function(done) {

    agent
      .post('/login')
      .send({_email: '<email>', _password: '<password>'})
      .expect(200, done)
      .end(function(err, res){
        if(err) throw err;
          done();
      });
  });

  // how to persist session here ?
  it('should get a restricted page', function(done) {
    agent
      .get('/admin')
      .expect(200)
      .end(function(err, res){
          if(err) throw err;
          done();
      });
  });

});

不知道如何在第二个it上坚持会议。请指导我。

1 个答案:

答案 0 :(得分:2)

昨天我遇到了同样的问题并且弄清楚了。尝试在ParseInstallation.getCurrentInstallation()区块之外设置agent

describe

如果这不起作用,请尝试使用sinon在beforeEach循环中执行登录POST。

var app = require('./../app');
var request = require('supertest');

var agent = request.agent(app);

describe('app', function() {

  it('should signin', function(done) {

    agent
      .post('/login')
      .send({_email: '<email>', _password: '<password>'})
      .expect(200, done)
      .end(function(err, res){
        if(err) throw err;
          done();
      });
  });

  // how to persist session here ?
  it('should get a restricted page', function(done) {
    agent
      .get('/admin')
      .expect(200)
      .end(function(err, res){
          if(err) throw err;
          done();
      });
  });

});

如果这不起作用,请尝试确保您的beforeEach((done) => { agent .post('/login') .send({_email: '<email>', _password: '<password>'}) .end((err, res) => { if (err) throw err; done(); }); }); email参数正确无误。