Node.js 在Express中测试中间件时提供会话

Node.js 在Express中测试中间件时提供会话,node.js,express,supertest,express-session,nock,Node.js,Express,Supertest,Express Session,Nock,我正在尝试使用supertest和nock测试Express应用程序中的中间件功能,但遇到问题,即我设置的路由由较早的中间件检查,以确保传入的req对象上存在会话属性 在运行测试之前,我需要以某种方式模拟会话对象,但我不确定如何实现这一点。首先,让我分享一些代码: router.js app.use('/api', helpers.hasAccessToken, require('./routes.js')); router.route('/*') .get(routesControlle

我正在尝试使用supertest和nock测试Express应用程序中的中间件功能,但遇到问题,即我设置的路由由较早的中间件检查,以确保传入的
req
对象上存在会话属性

在运行测试之前,我需要以某种方式模拟会话对象,但我不确定如何实现这一点。首先,让我分享一些代码:

router.js

app.use('/api', helpers.hasAccessToken, require('./routes.js'));
router.route('/*')
  .get(routesController.fetch)
module.exports.hasAccessToken = function(req, res, next) {
  if(req.session.accessToken){
    next();
  } else {
    res.status(401).send('LOGIN_SESSION_ENDED');
  }
};
module.exports.fetch = function(req, res) {
  var options = helpers.buildAPIRequestOptions(req);
  request(options, function(err, response, body){
    res.status(response.statusCode).send(body);
  });
};
var app = require('./index.js'),
  request = require('supertest')(app),
  expect = require('chai').expect,
  nock = require('nock');


describe('GET requests', function(){
  beforeEach(function(){
    nock('https://10.105.195.12:8243')
      .get('/v1/schemes')
      .reply(200, {foo:'bar'});
  });
  it('should return a 200 HTTP status code', function(done){
    request
      .get('/api/schemes')
      .end(function(err, res){
        expect(res.status).to.equal(200);
        done();
      });
  });
});
routes.js

app.use('/api', helpers.hasAccessToken, require('./routes.js'));
router.route('/*')
  .get(routesController.fetch)
module.exports.hasAccessToken = function(req, res, next) {
  if(req.session.accessToken){
    next();
  } else {
    res.status(401).send('LOGIN_SESSION_ENDED');
  }
};
module.exports.fetch = function(req, res) {
  var options = helpers.buildAPIRequestOptions(req);
  request(options, function(err, response, body){
    res.status(response.statusCode).send(body);
  });
};
var app = require('./index.js'),
  request = require('supertest')(app),
  expect = require('chai').expect,
  nock = require('nock');


describe('GET requests', function(){
  beforeEach(function(){
    nock('https://10.105.195.12:8243')
      .get('/v1/schemes')
      .reply(200, {foo:'bar'});
  });
  it('should return a 200 HTTP status code', function(done){
    request
      .get('/api/schemes')
      .end(function(err, res){
        expect(res.status).to.equal(200);
        done();
      });
  });
});
helpers.js

app.use('/api', helpers.hasAccessToken, require('./routes.js'));
router.route('/*')
  .get(routesController.fetch)
module.exports.hasAccessToken = function(req, res, next) {
  if(req.session.accessToken){
    next();
  } else {
    res.status(401).send('LOGIN_SESSION_ENDED');
  }
};
module.exports.fetch = function(req, res) {
  var options = helpers.buildAPIRequestOptions(req);
  request(options, function(err, response, body){
    res.status(response.statusCode).send(body);
  });
};
var app = require('./index.js'),
  request = require('supertest')(app),
  expect = require('chai').expect,
  nock = require('nock');


describe('GET requests', function(){
  beforeEach(function(){
    nock('https://10.105.195.12:8243')
      .get('/v1/schemes')
      .reply(200, {foo:'bar'});
  });
  it('should return a 200 HTTP status code', function(done){
    request
      .get('/api/schemes')
      .end(function(err, res){
        expect(res.status).to.equal(200);
        done();
      });
  });
});
routeController.js

app.use('/api', helpers.hasAccessToken, require('./routes.js'));
router.route('/*')
  .get(routesController.fetch)
module.exports.hasAccessToken = function(req, res, next) {
  if(req.session.accessToken){
    next();
  } else {
    res.status(401).send('LOGIN_SESSION_ENDED');
  }
};
module.exports.fetch = function(req, res) {
  var options = helpers.buildAPIRequestOptions(req);
  request(options, function(err, response, body){
    res.status(response.statusCode).send(body);
  });
};
var app = require('./index.js'),
  request = require('supertest')(app),
  expect = require('chai').expect,
  nock = require('nock');


describe('GET requests', function(){
  beforeEach(function(){
    nock('https://10.105.195.12:8243')
      .get('/v1/schemes')
      .reply(200, {foo:'bar'});
  });
  it('should return a 200 HTTP status code', function(done){
    request
      .get('/api/schemes')
      .end(function(err, res){
        expect(res.status).to.equal(200);
        done();
      });
  });
});
RouteController.spec.js

app.use('/api', helpers.hasAccessToken, require('./routes.js'));
router.route('/*')
  .get(routesController.fetch)
module.exports.hasAccessToken = function(req, res, next) {
  if(req.session.accessToken){
    next();
  } else {
    res.status(401).send('LOGIN_SESSION_ENDED');
  }
};
module.exports.fetch = function(req, res) {
  var options = helpers.buildAPIRequestOptions(req);
  request(options, function(err, response, body){
    res.status(response.statusCode).send(body);
  });
};
var app = require('./index.js'),
  request = require('supertest')(app),
  expect = require('chai').expect,
  nock = require('nock');


describe('GET requests', function(){
  beforeEach(function(){
    nock('https://10.105.195.12:8243')
      .get('/v1/schemes')
      .reply(200, {foo:'bar'});
  });
  it('should return a 200 HTTP status code', function(done){
    request
      .get('/api/schemes')
      .end(function(err, res){
        expect(res.status).to.equal(200);
        done();
      });
  });
});
我的测试失败,因为
res.status
的值为401。我使用的是express session,但我想知道是否有某种方法可以在运行任何测试之前获取测试套件中的
req.session
对象并设置accessToken属性的值

有人能提供一些建议/想法吗


谢谢

让我们为
req.session
对象创建一些存根,其值由我们控制

var app = require('./index.js'),
  request = require('supertest'), // no longer app here as we want to call parentApp
  expect = require('chai').expect,
  nock = require('nock');

describe('GET requests', function(){
  var parentApp;

  beforeEach(function(){
    parentApp = express();
    parentApp.use(function(req, res, next) { // lets stub session middleware
      req.session = {};
      next();
    })
    parentApp.get('/api', function(req, res, next) {
      req.session.accessToken = true;  // and provide some accessToken value
      next();
    })
    parentApp.use(app);
    nock('https://10.105.195.12:8243')
      .get('/v1/schemes')
      .reply(200, {foo:'bar'});
  });

  it('should return a 200 HTTP status code', function(done){
    request(parentApp) // we are testing now app through parentApp and stubbed middleware
      .get('/api/schemes')
      .end(function(err, res){
        expect(res.status).to.equal(200);
        done();
      });
  });
});