在Express中testing中间件时提供会话

我尝试使用supertest和nock在我的Express应用程序中testing中间件function,但遇到了问题,我设置的路由由中间件的前面部分检查,以确保传入的req对象上存在会话属性。

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

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

我的testing失败,因为res.status的值是401.我正在使用快速会话,但是我想知道是否有某种方法可以获得我的testing套件中的req.session对象,并将accessToken属性的值事先设置为运行任何testing。

任何人都可以提供任何意见和build议吗?

谢谢

让我们为req.session对象创build一些存根, 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(); }); }); }); 
Interesting Posts