2017-03-14 33 views
1

我目前正在學習測試一個jwt認證中間件。我的下一個回調被稱爲,因爲我在那裏放了一個console.log但我的sinon間諜斷言失敗。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正確地記錄,但興農斷言失敗。

回答

1

您的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 
    }); 
}); 

也許有更好的方式來格式化這將是:

這可以讓你您的斷言更靈活。如果因某種原因未被調用,它也會確保它失敗。

+0

我可以在這裏做什麼類型的斷言?一般來說,我還是新手。我想要測試的是回調函數被調用。 – Nate

+0

我已編輯答案,以示例斷言提供替代方案 – Varedis

+0

非常感謝!這工作。 – Nate