NodeJS超测访问会话对象

Posted

技术标签:

【中文标题】NodeJS超测访问会话对象【英文标题】:NodeJS supertest access to session object 【发布时间】:2013-12-11 09:29:05 【问题描述】:

我正在使用 supertest 测试我的 Node.js 应用程序。在我的控制器中,我访问会话对象。为了发出有效的请求,这个会话对象需要填充一些数据。

控制器

        // determine whether it is user's own profile or not
        var ownProfile = userId == req.session.user._id ? true : false;

测试

it('profile', function (done) 
    testUserOne.save(function(error, user)

        request
            .agent(server)
            .get('/profile?userId=' + user._id)
            .expect('Content-Type', /html/)
            .expect(200)
            .expect(/Profile/)
            .end(done);
    )
);

问题

如何模拟 req/session 对象?

【问题讨论】:

【参考方案1】:

仅用作子应用,并在父应用调用您的 authenticated():

var mockApp = express();
mockApp.use(session);
mockApp.all('*', function(req, res, next) 
    //authenticated(req, res, next);
    //OR
    req.session.uid = 'mock uid';
    next();
);
mockApp.use(app);

您的所有路由都将在匹配之前进行身份验证!

【讨论】:

有趣的选项。 mockApp.use(app) 的目的是什么?难道我们不用将mockApp链接到主快递吗? @nishant mockApp.use(app) 实际上是用原始应用程序扩展了 mockApp,因此将会话覆盖处理程序插入到原始应用程序中。值得注意的是,应该在测试中使用mockApprequest(mockApp)…。感谢您指出这一点! 能否添加会话的实例化?【参考方案2】:

这个新的库应该可以解决问题:

https://github.com/rjz/supertest-session

您还可以查看superagent,它是supertest 的一部分。这是一个很好的教程:

http://jaketrent.com/post/authenticated-supertest-tests/

不想要另一个库?试试这个...

https://gist.github.com/joaoneto/5152248

【讨论】:

请注意 Jake Trent 教程已过时,因为 saveCookies 已被弃用:github.com/visionmedia/superagent/issues/1014

以上是关于NodeJS超测访问会话对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NodeJS 中维护请求会话

验证 socket.io/nodejs 的用户

如何访问socket.io连接中的会话对象[重复]

如何在单独的表单页面上存储和访问存储在会话对象中的值

如何在渲染html页面中检索nodejs会话值?

当我尝试在javascript(Nodejs)中的另一个类中访问它时,类变成一个空对象[重复]