如何使用护照身份验证对快速路线进行单元测试

Fru*_*rai 5 unit-testing mocha.js node.js express passport.js

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

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

我试图只是模拟护照,但这没有用,因为我需要进行回调。我也尝试过使用 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));
        });
    });

 }
};
Run Code Online (Sandbox Code Playgroud)

num*_*8er 6

检查这个存储库,它有你想要的一切: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);
Run Code Online (Sandbox Code Playgroud)

2)app.js:

var
  express = require('express'),
  app = express();

app.use(require('./routes')); // routes.js file

module.exports = app;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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

  });
});
Run Code Online (Sandbox Code Playgroud)

ps 我使用jasmine作为测试框架,但即使mocha它的风格相同。因为它正在使用supertest-as-promised获取 app 模块并调用路由而不创建 http 对象。

ps2。这不是单元测试,您正在测试功能,因此检查所有代码链是否正确集成更像是集成测试。