2017-03-14 15 views
1

私は現在、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

expectは、おそらく早すぎます。コールバックが起こったと主張する前にコールバックが起こるのを待っているわけではありません。おそらく、この例では、全く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}` 
     } 
    }); 
    return authenticateJwt(request, response,() => { 
     // Do assertions in here 
    }); 
}); 

おそらくそれをフォーマットするより良い方法は、次のようになります。

これは、あなたが可能にアサーションの柔軟性が向上します。何らかの理由で呼び出されないと失敗することも保証します。

+0

ここでどのようなアサーションを行うことができますか?私はまだ一般的にテストするのが初めてです。私がテストしたいのは、コールバック関数が呼び出されただけです。 – Nate

+0

私は例のアサーションで代替案を提供するために答えを編集しています – Varedis

+0

ありがとうございました!これは機能します。 – Nate

関連する問題