在摩卡和超级测试中保持快速应用程序会话

egi*_*gig 2 session mocha.js node.js express supertest

我有一个快速应用程序,其身份验证由 JWT 处理,我只需在登录后将令牌存储在会话中。

req.session.JWToken = '<token>';
Run Code Online (Sandbox Code Playgroud)

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

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']}));
Run Code Online (Sandbox Code Playgroud)

我需要使用 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();
      });
  });

});
Run Code Online (Sandbox Code Playgroud)

不知道如何坚持第二次会议it。请指导我一个方向。

fro*_*dit 5

我昨天遇到了同样的问题并解决了。agent尝试在块之外设置describe

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();
      });
  });

});
Run Code Online (Sandbox Code Playgroud)

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

beforeEach((done) => {      
    agent
        .post('/login')
        .send({_email: '<email>', _password: '<password>'})
        .end((err, res) => {
            if (err) throw err;
            done();
        });
});
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,请尝试确保您的emailpassword参数正确。