如何在node.js中的compoundjs应用程序中模拟会话对象

时间:2013-04-09 15:09:52

标签: node.js mocha nodeunit compoundjs supertest

我在node.js中有一个复合js应用程序。 对于某些操作,我有一个过滤器检查是否存在“session.user”值,该值仅在成功验证后才会填充。 但是,每当为这些操作编写单元测试用例时,session.user值都是未定义的。 我使用supertest,sinon模块来生成get,将请求发布到操作但由于未定义的“session.user”值,它不会进行身份验证并重定向到正确的操作。 请帮助我,因为我坚持不懈。

请指导我究竟需要模拟的内容,以便我可以验证session.user值。 提前谢谢,

等待肯定答案,

谢谢,

1 个答案:

答案 0 :(得分:0)

我在复合配置事件中使用了模拟passport.initialize,测试助手和侦听器的组合。

这提供了两件事:

  1. DRY - 跨控制器测试重用beforeEach代码。
  2. 不显眼的测试 - 模拟passport.initialize所以我没有必要根据测试修改配置。
  3. 在test / 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);
        });
        [...]
    });