【问题标题】:Providing sessions when testing middleware in Express在 Express 中测试中间件时提供会话
【发布时间】:2017-03-30 19:45:17
【问题描述】:

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

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

router.js

app.use('/api', helpers.hasAccessToken, require('./routes.js'));

routes.js

router.route('/*')
  .get(routesController.fetch)

helpers.js

module.exports.hasAccessToken = function(req, res, next) {
  if(req.session.accessToken){
    next();
  } else {
    res.status(401).send('LOGIN_SESSION_ENDED');
  }
};

routesController.js

module.exports.fetch = function(req, res) {
  var options = helpers.buildAPIRequestOptions(req);
  request(options, function(err, response, body){
    res.status(response.statusCode).send(body);
  });
};

routesController.spec.js

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 属性。

有人可以提供任何建议\想法吗?

谢谢

【问题讨论】:

    标签: node.js express supertest express-session nock


    【解决方案1】:

    让我们为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();
          });
      });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多