【发布时间】:2015-11-10 21:09:26
【问题描述】:
我正在尝试对一个简单的 Express 中间件进行单元测试,这是一个级联认证器,它首先使用 passport-jwt-strategy 检查 JWT 令牌,然后如果失败,则使用 passport-openid-strategy。每个策略都已经过很好的测试,所以我要测试的是它们的集成。
我正在测试的模块如下所示:
"use strict";
let passport = require('passport');
let Strategies = require('./strategies');
let setupDone = false;
// set up passport
let setup = function(app) {
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});
passport.use('jwt', Strategies.jwt);
passport.use('openid', Strategies.openId);
app.use(passport.initialize());
app.use(passport.session());
setupDone = true;
};
let authenticate = function(req, res, next) {
if (!setupDone) throw new Error('You must have run setup(app) before you can use the middleware');
console.log(' cascadingAuthentication');
// first try the token option
passport.authenticate('jwt', function(jwterr, user, info) {
console.log(' jwt auth', jwterr, user, info);
if (jwterr || !user) {
passport.authenticate('openid, function(oautherr, user, info) {
if (oautherr || !user) {
return next(oautherr);
} else {
next();
}
});
} else {
req.user = user;
next();
}
});
};
module.exports = {
setup: setup,
authenticate: authenticate
}
我的Jasmine 测试看起来像这样
"use strict";
let CascadingAuthentication = require('../../lib/middleware/cascadingAuthentication');
let TokenUtils = require('../support/tokenUtils');
let email = 'testing@test.tes;
describe('cascadingAuthentication', function() {
describe('when there is a token in the header', function() {
let req;
let res = {};
let app = {
use: function(used) { console.log('app.use called with', typeof used); }
};
beforeEach(function(done) {
let token = TokenUtils.makeJWT(email);
req = {
app: app,
header: {
Authorization: `Bearer ${token}`
}
}
CascadingAuthentication.setup(app);
CascadingAuthentication.authenticate(req, res, function() {
done();
});
});
it('populates req.user', function() {
expect(req.user).toEqual(jasmine.any(Object));
});
});
});
我遇到的问题是,当我运行测试时,我看到了第一个 console.log(' cascadingAuthentication'),但我从来没有看到第二个 console.log('jwt auth', err, user, info)。代码只是在passport.authenticate 内死掉,没有调用回调,没有引发错误,或者根本没有提供任何反馈。
我正在通过gulp 使用Jasmine 运行我的测试。
我的问题是:按顺序,
- 您能看出我所做的任何明显而我可能错过的事情吗?
- 在我的
req、res或app中还有什么我应该模拟的东西可以使这个测试工作吗? - 有什么办法可以交互调试吗?在运行时单步执行被测代码,而不是仅仅添加
console.log语句(这对我来说似乎有点 1980 年代)。
【问题讨论】:
标签: node.js express jasmine passport.js gulp-jasmine