2016-11-16 14 views
1

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

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

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我使用快递会话,但我想,如果我的测试失败有我可以通过某种方式获取测试套件中的req.session对象,并在运行任何测试之前设置accessToken属性的值。

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

感谢

回答

2

让我们创造一些存根与价值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(); 
     }); 
    }); 
}); 
相关问题