2017-03-14 3 views
1

Ich lerne derzeit, eine JWT-Authentifizierung Express-Middleware zu testen. Mein nächster Rückruf wird angerufen, weil ich dort eine console.log gesetzt habe, aber meine sinon Spion Behauptung ist fehlgeschlagen.Sinon Spion nicht in einer Express-Middleware

Kann jemand diesen Fall betrachten?

Dies ist mein Testfall

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

Und hier ist meine Middleware

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" 
    }); 
    } 
} 

Mein console.log einloggt richtig, aber die Sinon Behauptung versagt.

Antwort

1

Ihr expect passiert wahrscheinlich zu früh. Sie warten nicht auf den Rückruf, bevor Sie bestätigen, dass der Rückruf stattgefunden hat.

Sie wahrscheinlich nicht sinon überhaupt in diesem Beispiel benötigen, sollte dies für Sie arbeiten:

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

Vielleicht eine bessere Art und Weise zu formatieren wäre:

Dies ermöglicht Ihnen, mehr Flexibilität mit Ihren Aussagen. Es stellt auch sicher, dass es fehlschlägt, wenn es aus irgendeinem Grund nicht aufgerufen wird.

+0

Welche Art von Behauptungen kann ich hier tun? Ich bin immer noch neu im Testen. Ich möchte nur testen, dass die Callback-Funktion aufgerufen wird. – Nate

+0

Ich habe die Antwort bearbeitet, um eine Alternative mit einer Beispielaussage zu geben – Varedis

+0

Vielen Dank! Das funktioniert. – Nate

Verwandte Themen