我在node.js中有一个复合js应用程序。 对于某些操作,我有一个过滤器检查“session.user”值是否存在,该值仅在成功身份验证后才会填充。 但每当为此类操作编写单元测试用例时,session.user 值就会变得不确定。 我使用 supertest、sinon 模块对操作发出 get、post 请求,但由于“session.user”值未定义,它不会进行身份验证并被重定向到正确的操作。 请帮助我,因为我也遇到了同样的问题。
请指导我到底需要模拟什么,以便我可以验证 session.user 值。 提前致谢,
等待肯定的答复,
谢谢
最佳答案
我使用了模拟 Passport.initialize、测试助手和复合配置事件监听器的组合。
这提供了两件事:
- DRY - 在 Controller 测试中重用
beforeEach
代码。 - 不显眼的测试 - 模拟 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/