测试jsonwebtoken身份验证表达中间件

时间:2017-03-06 10:33:33

标签: node.js express

我目前正在学习一般的测试,我不确定如何测试一个验证jsonwebtoken的快速中间件。快速中间件基本上是一个功能,所以理论上它应该是可单元测试的。有人能告诉我怎么会这样做吗?到目前为止,这是我的中间件。我目前正在使用mocha和chai作为我的测试框架。

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;

1 个答案:

答案 0 :(得分:3)

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

因此,通过模拟req / res / next,您将完全控制输入和输出。如下。

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这样的其他变量并不是最好的选择。 Sinon或其他间谍可能会更好。