gpt4 book ai didi

node.js - 在 Express 中测试中间件时提供 session

转载 作者:太空宇宙 更新时间:2023-11-03 21:56:06 26 4
gpt4 key购买 nike

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

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

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。我正在使用快速 session ,但我想知道是否有某种方法可以访问 req.session我的测试套件中的对象,并在运行任何测试之前设置 accessToken 属性的值。

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

谢谢

最佳答案

让我们为 req.session 对象创建一些 stub ,其值在我们的控制之下。

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

关于node.js - 在 Express 中测试中间件时提供 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40635041/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com