2016-11-05 23 views
1

我正在製作一個使用JWT進行身份驗證的REST API,但要測試我的端點,我想模擬驗證JWT的中間件。NodeJS和Express - 如何模擬令牌認證中間件進行測試?

我已經定義了一箇中間件檢查令牌:

// middlewares/auth.js 

nJwt = require('njwt'); 
nconf = require('nconf'); 

module.exports = { 
    verifyToken: function(req, res, next) { 
     // check header or url parameters or post parameters for token 
     var token = req.body.token || req.query.token || req.headers['x-access-token']; 

     // decode token 
     if (token) { 

      // verifies secret and checks exp 
      nJwt.verify(token, nconf.get("auth:secret"), function(err, verifiedJwt) { 
       if (err) { 
       return res.json({ success: false, message: 'Failed to authenticate token.' }); 
       } else { 
       // if everything is good, save to request for use in other routes 
       req.userId = verifiedJwt.body.sub; 
       next(); 
       } 
      }); 

     } else { 
      // if there is no token 
      // return an error 
      return res.status(403).send({ 
       success: false, 
       message: 'No token provided.' 
      }); 

     } 
    } 
} 

然後在我的路由器,我可以導入和使用該中間件上保護端點

// routes/someRoutes.js 

var router = require('express').Router(); 
var verifyToken = require('../middlewares/auth').verifyToken; 

router.use(verifyToken); 

// define routes 

現在我想嘲笑這個中間件以便我可以在不需要有效令牌的情況下測試端點。我試着用柴/摩卡/興農做什麼,但沒有多少運氣

// tests/someRoutes.js 

var auth = require('../middlewares/auth'); 
var sinon = require('sinon'); 

describe('someRoute', function() { 
    var verifyTokenStub; 

    before(function (done) { 
     verifyTokenStub = sinon.stub(auth, 'verifyToken', function(req, res, next) { 
      req.userId='test-id'; 
      next(); 
     }); 
    }); 
}); 

但這仍然是調用原來verifyToken方法。任何幫助深表感謝!

+0

您是否找到任何解決方案? –

回答

3
  1. 更改您的middlewares/auth.js文件檢查process.env.NODE_ENV

實施例:

// middlewares/auth.js 
... 
    // decode token 
    if (token || process.env.NODE_ENV === 'test') {//Changes in this string 

     // verifies secret and checks exp 
     nJwt.verify(token, nconf.get("auth:secret"), function(err, verifiedJwt) { 
... 
  • 如果使用supertest或包裝相同的功能,運行摩卡與環境變量 - NODE_ENV=test mocha

  • 如果全面測試您的應用程序,那麼您應該使用環境變量 - NODE_ENV=test npm start來啓動它。

  • 這不是嘲弄,但我希望它能幫助你。

    +1

    我不確定我喜歡將狀態綁定到身份驗證中間件的想法。似乎很混亂。 –