node.js - 如何使用 Passport 身份验证对快速路线进行单元测试

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

一个单元如何测试依赖于 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/

相关文章:

node.js - 使用 Mocha 进行 NodeJS EventEmitter 测试

Node.js/Express 每月从 API 提取的流程

javascript - 运行 npm start 时无法执行启动脚本

Node.js 获取打开文件描述符计数(开发)

node.js - 为什么我应该使用 Restify?

javascript - 无法从 Promise 中检索数据

python - 在 python nostests 覆盖率报告中显示没有单元测试的文件

perl - 我怎样才能在另一个模块中模拟一个子模块?

javascript - 通过 POST 将文件传递给 NodeJS,然后传递给另一个 API,而不保存在磁盘上

node.js - 如何在 SailsJs 中使用 Sequelize