我正在尝试对一个简单的 Express 中间件进行单元测试,这是一个级联认证器,它首先使用 a 检查 JWT 令牌passport-jwt-strategy
,然后如果失败,使用 a 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
using运行我的测试Jasmine
。
我的问题是:按顺序,
- 你能看到我所做的任何我可能错过的明显事情吗?
- 还有什么我应该在我的
req
,中模拟出来的res
,或者app
可以使这个测试工作的东西吗? - 有什么方法可以交互调试吗?在运行时单步执行被测代码,而不仅仅是添加
console.log
语句(这对我来说似乎有点 1980 年代)。