2013-04-09 52 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); 
    }); 
    [...] 
}); 
相关问题