如何使用护照验证

时间:2016-10-04 21:24:57

标签: node.js unit-testing express mocha passport.js

一个单元如何测试依赖于护照身份验证的快速路由器来调用辅助方法?

我是新手来表达单元测试,而且我已经看到很多代码实际上都会命中服务器来调用该方法。但这不会使它成为集成测试吗?这最终归结为我对快速单元测试的最佳实践缺乏了解。

我试图嘲笑护照,但这不起作用,因为我需要进行回调。我也尝试过使用重新连接,只是尝试测试辅助方法,而且我认为这似乎也不起作用,因为文件包含在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));
        });
    });

 }
};

1 个答案:

答案 0 :(得分:4)

检查此存储库,它包含您想要的所有内容: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获取app模块并调用路由而不创建http对象。

p.s.2。它不是单元测试,您正在测试该功能,因此它需要进行更多集成测试,以检查所有代码链是否已正确集成。