我目前正在学习测试jwt身份验证表达中间件。我的下一个回调是被调用的,因为我在那里放了一个console.log
但是我的sinon间谍断言失败了。
有人可以看看这个案子吗?
这是我的测试用例
it("should call next when the token provided is valid", () => {
let token = jwt.sign({}, process.env.JWT);
let request = httpMocks.createRequest({
headers: {
Authorization: `Bearer ${token}`
}
});
const next = sinon.spy();
authenticateJwt(request, response, next);
expect(next.calledOnce).to.be.true;
});
这是我的中间件
import jwt from "jsonwebtoken";
export default function(req, res, next){
const authorizationHeaders = req.headers["authorization"];
let token;
if(authorizationHeaders){
token = authorizationHeaders.split(" ")[1];
}
if(token){
jwt.verify(token, process.env.JWT, (err, decodedToken) => {
if(err){
res.status(401).json({
message: "invalid token provided"
});
} else {
res.user = decodedToken;
console.log("called");
next();
}
});
} else {
res.status(401).json({
success: false,
message: "no token provided"
});
}
}
我的console.log
正确记录但是sinon断言失败了。
答案 0 :(得分:1)
你的jQuery(document).ready(function($) {
$('.contactTitle').click(function(){
if(!$(this).hasClass('active')){
$('.contactDesc').slideUp();
$('.contactTitle').removeClass('active');
$(this).next('.contactDesc').slideDown();
$(this).addClass('active');
}
});
});
可能发生得太早了。在断言它已经发生之前,你不是在等待回调发生。
在这个例子中你根本不需要sinon,这应该适合你:
expect
格式化它的更好方法可能是:
it("should call next when the token provided is valid", () => {
let token = jwt.sign({}, process.env.JWT);
let request = httpMocks.createRequest({
headers: {
Authorization: `Bearer ${token}`
}
});
return authenticateJwt(request, response, () => {
// Do assertions in here
});
});
这使您可以更灵活地使用断言。如果由于某种原因没有调用它,它还可以确保它失败。