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

标签 node.js mocha.js nodeunit compoundjs supertest

我在node.js中有一个复合js应用程序。 对于某些操作,我有一个过滤器检查“session.user”值是否存在,该值仅在成功身份验证后才会填充。 但每当为此类操作编写单元测试用例时,session.user 值就会变得不确定。 我使用 supertest、sinon 模块对操作发出 get、post 请求,但由于“session.user”值未定义,它不会进行身份验证并被重定向到正确的操作。 请帮助我,因为我也遇到了同样的问题。

请指导我到底需要模拟什么,以便我可以验证 session.user 值。 提前致谢,

等待肯定的答复,

谢谢

最佳答案

我使用了模拟 Passport.initialize、测试助手和复合配置事件监听器的组合。

这提供了两件事:

  1. DRY - 在 Controller 测试中重用 beforeEach 代码。
  2. 不显眼的测试 - 模拟 Passport.initialize,因此我无需根据测试修改配置。

在 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();
        };
    };
};

然后我添加了一个要在每个 Controller 中调用的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;
    }
};

这将在每个 Controller 的 beforeEach 中调用:

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

关于node.js - 如何在node.js中的compoundjs应用程序中模拟 session 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15905658/

相关文章:

node.js - NodeJS 集群调度策略

javascript - Sails.js Socket.IO 使用时间范围窗口获取数据 (setInterval)

node.js - Node.js 的单元测试

angularjs - Multer 1.0.3 Mean Stack 文件上传

javascript - 使用 Mocha 和 Chai 断言 Javascript 数组中包含的值

javascript - 如果变量具有反应组件作为值,我如何使用 mocha/chai/sinon 进行单元测试?

javascript - 诗乃找不到方法 'spy'

node.js - 使用 Sinon 时,如何替换 stub 实例中的 stub 函数?

node.js - 如何将 node.js 模块 'nodeunit' 与 coffeescript 文件一起使用

javascript - 当 Ajax 使用长轮询时,如何更新 AngularJS 中的模型?