测试JSONWEBTOKEN身份验证Express中间件



我当前正在学习进行测试,我不确定如何测试一个对jsonwebtoken进行身份验证的快速中间件。明确的中间件基本上是一个函数,因此从理论上讲应该是单位测试的。有人可以告诉我一个人会怎么做吗?到目前为止,这是我的中间件。我目前正在使用摩卡和柴作为我的测试框架。

import jwt from "jsonwebtoken";
import secret from "../jwtSecret"
function authenticateJwt(req, res, next){
  let token;
  let authorizationHeaders = req.headers["authorization"];
  if(authorizationHeaders){
    token = authorizationHeaders.split(" ")[1];
  }
  if(token) {
    jwt.verify(token, secret, (err, decodedToken) => {
      if(err){
        res.status(403).json({
          success: false,
          error: "Invalid token provided"
        });
      } else {
        next();  
      }
    });
  } else {
    res.status(403).json({
      success: false,
      error: "No token provided"
    });
  }
}
export default authenticateJwt;

好吧,通过测试输入和输出,您可以测试功能。在这种情况下,req/res/下一个是输入。但是res.status(403).json()next()代替return,是您的中间件(或输出)的结果。

因此,通过嘲笑req/res/下一步,您将完全控制输入和输出。如下。

describe('middleware/auth', ()=> {
  let mockReq = {
    headers:{} // your JWT here
  }
  let mockRes = {
    status = function(code){return 'status${code}'}
  }
  let nextCalled = false;
  let next = function(){nextCalled = true}
  it('should pass on right jwt',()=>{
    mockReq.headers['JWT'] = 'right jwt'
    authenticateJwt(mockReq, mockRes, next)
    expect(nextCalled).to.be.true;
  })
})

但是使用其他变量(例如NextCalled)并不是最佳选择。辛农或其他间谍可能会更好。

最新更新