我当前正在学习进行测试,我不确定如何测试一个对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)并不是最佳选择。辛农或其他间谍可能会更好。