除非函数,否则如何模拟 Express JWT?
Posted
技术标签:
【中文标题】除非函数,否则如何模拟 Express JWT?【英文标题】:How to mock Express JWT unless function? 【发布时间】:2019-08-26 06:40:08 【问题描述】:我正在使用 Express 和 Express-JWT。
在我使用的 Express() 实例中:
const api = express()
api.use(jwt(
// my options
))
为了在测试中模拟这个,我使用了一个 mocks\express-jwt\index.js
文件,其中包含:
const jwt = jest.fn().mockImplementation(options => (req, res, next) =>
// set dummy req.user and call
next()
)
module exports = jwt
这一切都很好。 现在我想跳过根端点的 JWT,所以我将 jwt 的用法更改为:
api.use(jwt(
// my options
).unless(path:['/']))
在我的模拟文件中我添加了:
jwt.unless = jest.fn().mockImplementation(options => (req, res, next) =>
next()
)
但是,现在测试总是以function unless is not defined
失败。
有人知道如何模拟这种unless
行为吗?
【问题讨论】:
除非来自哪里?由此?express-unless
【参考方案1】:
unless
被用作调用jwt
的结果的属性。
所以要模拟它,请将您的 unless
模拟添加为您的 jwt
模拟返回的函数的属性:
const jwt = jest.fn().mockImplementation(options =>
const func = (req, res, next) =>
// set dummy req.user and call
next();
;
func.unless = jest.fn().mockImplementation(options => (req, res, next) =>
next();
);
return func;
);
module.exports = jwt;
【讨论】:
【参考方案2】:Brian 建议的答案对我不起作用,因为在 func
方法中,我做了一些伪造授权检查的事情。
我的问题是我需要跳过对unless
函数给出的方法+路径的授权检查。
我现在的解决办法是这样的:
const jet = jest.fn(options =>
let mockFunc = (req, res, next) =>
// get authorization from request
let token = ...
if (!token)
res.status(401).send('No token provided')
else
req.token = token
next()
mockFunc.unless = jest.fn(args => (req, res, next) =>
if (args.method == req.method && arg.path == req.path)
// not do authorization check for excluded endpoint via unless
next()
else
mockFunc(req, res, next)
return mockFunc
感谢 Brian 为我指明了正确的方向。
【讨论】:
以上是关于除非函数,否则如何模拟 Express JWT?的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 express-jwt 阻止访问除登录页面以外的 Angular 应用程序时出现问题
如何将数据从 express 中间件直接传递回客户端 JWT 和 Express 中间件