除非函数,否则如何模拟 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 中间件

如何模拟 JWT 令牌以将其与 Mockito 和 Spring Boot 一起使用

将 JWT 与 nodejs 和 express 一起使用

除非模拟器是 XS 类型,否则屏幕上的按钮不起作用

如何查看存储在 JWT 中的数据?使用 auth0 和 express-jwt