2013-04-09 16 views
1

我在node.js中有複合js應用程序。 對於一些操作,我有一個過濾器檢查「session.user」值的存在,只有在成功認證後纔會填充該值。 但是,無論何時編寫這些操作的單元測試用例,session.user值都是未定義的。 我使用supertest,sinon模塊來獲取,發佈請求到動作,但由於未定義的「session.user」值,它沒有進行身份驗證並被重定向到適當的動作。 請幫助我,因爲我堅持相同。如何模擬node.js中的複合應用程序中的會話對象

請指導我究竟需要模擬什麼,以便我可以驗證session.user值。 由於提前,

等待肯定回答,

謝謝,

+0

我有類似的問題。請參閱我的回答http://stackoverflow.com/a/17732950/448876 – absynce 2013-08-06 22:26:35

回答

0

我用嘲笑passport.initialize,測試助手,並在化合物配置事件的監聽器的組合。

這提供了兩件事情:

  1. DRY - 跨控制器測試beforeEach代碼重用。
  2. 不顯眼的測試 - 模擬passport.initialize,所以我沒有必要修改基於測試的配置。

在測試/ init.js我添加的方法,以模擬passport.initialize **:

http://hackerpreneurialism.com/post/48344246498/node-js-testing-mocking-authenticated-passport-js

// Fake user login with passport. 
app.mockPassportInitialize = function() { 
    var passport = require('passport'); 
    passport.initialize = function() { 
     return function (req, res, next) { 
      passport = this; 
      passport._key = 'passport'; 
      passport._userProperty = 'user'; 
      passport.serializeUser = function(user, done) { 
       return done(null, user.id); 
      }; 
      passport.deserializeUser = function(user, done) { 
       return done(null, user); 
      }; 
      req._passport = { 
       instance: passport 
      }; 
      req._passport.session = { 
       user: new app.models.User({ id: 1, name: 'Joe Rogan' }) 
      }; 

      return next(); 
     }; 
    }; 
}; 

然後,我添加一個:

**在發現它helpers.js文件在每個控制器中調用:

module.exports = { 
    prepApp: function (done) { 
     var app = getApp(); 
     compound = app.compound; 
     compound.on('configure', function() { app.mockPassportInitialize(); }); 
     compound.on('ready', function() { done(); }); 
     return app; 
    } 
}; 

這將在每個控制器的beforeEach中調用:

describe('UserController', function() { 
    beforeEach(function (done) { 
     app = require('../helpers.js').prepApp(done); 
    }); 
    [...] 
}); 
相關問題