如何使用护照身份验证对快速路线进行单元测试
How to unit test express route with passport authenticate
一个单元如何测试依赖于护照身份验证以调用辅助方法的快速路由器?
我是表达单元测试的新手,我见过很多实际命中服务器调用方法的代码。但这不会使它成为集成测试吗?这最终归结为我对快速单元测试的最佳实践缺乏了解。
我试过模拟护照,但没用,因为我需要回电。我也尝试过使用 rewire 并尝试测试辅助方法,但我认为这似乎也不起作用,因为文件包装在 module.export.
中
如有任何帮助,我们将不胜感激。
我正在尝试单元测试的文件:
module.exports = function (inject) {
var router = require('express').Router();
var app = inject.app;
return router.get('/', app.passport.authenticate('bearer', { session: false }), [editContentCheck, getUser]);
function editContentCheck(req,res,next) {
if(req.authInfo.scope.indexOf('readOwnUser') == -1) {
res.statusCode = 403;
return res.end('Forbidden');
}
return next();
}
function getUser(req, res) {
var authHeader = req.headers.authorization.split(' ');
var token = authHeader[1];
var models = require('../models');
models.AccessToken.getAccessToken(token,function(err,tokenObj) {
models.User.getUser(tokenObj.userId, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
res.send(JSON.stringify(user));
});
});
}
};
检查这个存储库,它有你想要的一切:https://github.com/num8er/alttab-nodejs-challenge
另请查看示例并按您的意愿实施它:
1)server.js :
var
http = require('http'),
app = require('./app'); // app.js file
http.createServer(app).listen(8080);
2)app.js :
var
express = require('express'),
app = express();
app.use(require('./routes')); // routes.js file
module.exports = app;
3)routes.js :
var router = require('express').Router();
function editContentCheck(req,res,next) {}
function getUser(req, res) {}
router.get('/posts', app.passport.authenticate('bearer', { session: false }), [editContentCheck, getUser]);
module.exports = router;
4)spec/AppSpec.js :
var
request = require('supertest-as-promised'), // npm i --save-dev supertest-as-promised
app = require('./../app');
var token = "some token here";
describe('App', function() {
describe("Posts", function() {
it('should pass auth check and get posts', function() {
return request(app)
.get('/posts')
.set('Authorization', 'Bearer ' + token)
.expect(200);
});
});
});
p.s。我使用 jasmine
作为测试框架,但即使使用 mocha
它也是相同的风格。因为它使用 supertest-as-promised
获取应用程序模块并在不创建 http 对象的情况下调用路由。
p.s.2。这不是单元测试,您是在测试功能,因此它更像是一个集成测试,用于检查所有代码链是否已正确集成。
一个单元如何测试依赖于护照身份验证以调用辅助方法的快速路由器?
我是表达单元测试的新手,我见过很多实际命中服务器调用方法的代码。但这不会使它成为集成测试吗?这最终归结为我对快速单元测试的最佳实践缺乏了解。
我试过模拟护照,但没用,因为我需要回电。我也尝试过使用 rewire 并尝试测试辅助方法,但我认为这似乎也不起作用,因为文件包装在 module.export.
中如有任何帮助,我们将不胜感激。
我正在尝试单元测试的文件:
module.exports = function (inject) {
var router = require('express').Router();
var app = inject.app;
return router.get('/', app.passport.authenticate('bearer', { session: false }), [editContentCheck, getUser]);
function editContentCheck(req,res,next) {
if(req.authInfo.scope.indexOf('readOwnUser') == -1) {
res.statusCode = 403;
return res.end('Forbidden');
}
return next();
}
function getUser(req, res) {
var authHeader = req.headers.authorization.split(' ');
var token = authHeader[1];
var models = require('../models');
models.AccessToken.getAccessToken(token,function(err,tokenObj) {
models.User.getUser(tokenObj.userId, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
res.send(JSON.stringify(user));
});
});
}
};
检查这个存储库,它有你想要的一切:https://github.com/num8er/alttab-nodejs-challenge
另请查看示例并按您的意愿实施它:
1)server.js :
var
http = require('http'),
app = require('./app'); // app.js file
http.createServer(app).listen(8080);
2)app.js :
var
express = require('express'),
app = express();
app.use(require('./routes')); // routes.js file
module.exports = app;
3)routes.js :
var router = require('express').Router();
function editContentCheck(req,res,next) {}
function getUser(req, res) {}
router.get('/posts', app.passport.authenticate('bearer', { session: false }), [editContentCheck, getUser]);
module.exports = router;
4)spec/AppSpec.js :
var
request = require('supertest-as-promised'), // npm i --save-dev supertest-as-promised
app = require('./../app');
var token = "some token here";
describe('App', function() {
describe("Posts", function() {
it('should pass auth check and get posts', function() {
return request(app)
.get('/posts')
.set('Authorization', 'Bearer ' + token)
.expect(200);
});
});
});
p.s。我使用 jasmine
作为测试框架,但即使使用 mocha
它也是相同的风格。因为它使用 supertest-as-promised
获取应用程序模块并在不创建 http 对象的情况下调用路由。
p.s.2。这不是单元测试,您是在测试功能,因此它更像是一个集成测试,用于检查所有代码链是否已正确集成。