一个单元如何测试依赖于 Passport 身份验证以调用辅助方法的快速路由器?
我是表达单元测试的新手,我见过很多实际命中服务器以调用该方法的代码。但这不会使它成为集成测试吗?这最终归结为我对快速单元测试的最佳实践缺乏了解。
我试过模拟 Passport ,但没有用,因为我需要回电。我也尝试过使用 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)服务器.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)路由.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)规范/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);
});
});
});
附注我使用 jasmine
作为测试框架,但即使使用 mocha
它也是相同的风格。因为它使用 supertest-as-promised
获取应用程序模块并在不创建 http 对象的情况下调用路由。
附注 2。这不是单元测试,您是在测试功能,因此它更像是一个集成测试,用于检查所有代码链是否已正确集成。
关于node.js - 如何使用 Passport 身份验证对快速路线进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39862010/