Sinon间谍没有被称为快速中间件

时间:2017-03-14 09:46:51

标签: node.js express sinon

我目前正在学习测试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断言失败了。

1 个答案:

答案 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
    });
});

这使您可以更灵活地使用断言。如果由于某种原因没有调用它,它还可以确保它失败。