2017-03-06 21 views
3

我目前正在學習測試一般,我不知道如何測試一個快速中間件驗證jsonwebtoken。表達中間件基本上是一個功能,因此理論上它應該是單元可測試的。有人能告訴我怎麼會這樣做嗎?到目前爲止,這是我的中間件。我目前使用摩卡和柴作爲我的測試框架。測試一個jsonwebtoken認證express中間件

import jwt from "jsonwebtoken"; 
import secret from "../jwtSecret" 

function authenticateJwt(req, res, next){ 
    let token; 
    let authorizationHeaders = req.headers["authorization"]; 
    if(authorizationHeaders){ 
    token = authorizationHeaders.split(" ")[1]; 
    } 
    if(token) { 
    jwt.verify(token, secret, (err, decodedToken) => { 
     if(err){ 
     res.status(403).json({ 
      success: false, 
      error: "Invalid token provided" 
     }); 
     } else { 
     next(); 
     } 
    }); 
    } else { 
    res.status(403).json({ 
     success: false, 
     error: "No token provided" 
    }); 
    } 
} 

export default authenticateJwt; 

回答

2

那麼,通過測試輸入和輸出,你可以測試一個函數。在這種情況下,req/res/next是輸入。但不是returnres.status(403).json()next()來自您的中間件(或輸出)。

所以通過嘲笑req/res/next,你將完全控制輸入和輸出。如下。

describe('middleware/auth',()=> { 
    let mockReq = { 
    headers:{} // your JWT here 
    } 
    let mockRes = { 
    status = function(code){return 'status${code}'} 
    } 
    let nextCalled = false; 
    let next = function(){nextCalled = true} 

    it('should pass on right jwt',()=>{ 
    mockReq.headers['JWT'] = 'right jwt' 
    authenticateJwt(mockReq, mockRes, next) 
    expect(nextCalled).to.be.true; 
    }) 
}) 

但是使用像nextCalled這樣的附加變量並不是最好的選擇。 Sinon或其他間諜可能會更好。

+0

那麼我應該使用哪些庫來測試這個功能?目前只使用摩卡作爲我的測試跑者和柴的斷言。我真的不想學習像錫諾這樣的另一個圖書館。沒有這些庫可以測試當前的功能嗎? – Nate

+0

我沒有在我的例子中使用sinon,所以當然你可以用這種方式來測試它。像sinon這樣的間諜可以更容易地檢查一個函數是否被調用,就像我的例子中的next()。但免費罰款首先使用摩卡和柴。 – YLS