我目前正在学习一般的测试,我不确定如何测试一个验证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;
答案 0 :(得分:3)
那么,通过测试输入和输出,您可以测试一个函数。在这种情况下,req / res / next是输入。但代替return
,res.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或其他间谍可能会更好。