Node.js 访问;req";响应后Supertest中的对象
在测试请求时/之后,是否有任何方法可以直接访问Node.js 访问;req";响应后Supertest中的对象,node.js,express,supertest,passport.js,Node.js,Express,Supertest,Passport.js,在测试请求时/之后,是否有任何方法可以直接访问supertest中的req对象?我想测试我的passport策略,所以我想检查req.user,req.session,也许还有其他。我知道我可以测试页面重定向或flash,因为我的策略就是这样做的,但是查看req对象上是否有用户似乎也很有用。如果我这样做,我还可以检查一次有多少用户 我将使用“本地注册”策略为用户注册,其定义如下: 'use strict'; // get passport & mongoose var passport
supertest
中的req
对象?我想测试我的passport
策略,所以我想检查req.user
,req.session
,也许还有其他。我知道我可以测试页面重定向或flash,因为我的策略就是这样做的,但是查看req
对象上是否有用户似乎也很有用。如果我这样做,我还可以检查一次有多少用户
我将使用“本地注册”策略为用户注册,其定义如下:
'use strict';
// get passport & mongoose
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var UserModel = require('mongoose').model('User');
module.exports = function() {
// signup function
passport.use('local-signup', new LocalStrategy({
passReqToCallback: true // pass the entire request to the callback
},
function(req, username, password, done) {
process.nextTick(function() {
// find a user with the same username
UserModel.findOne({username: username}, function(err, user) {
// if there is an error, log it then return it
if(err) {
console.log("Error finding a user in the database: " + err);
return done(err);
}
// if a user was already found
if(user) {
return done(null, false, "User already exists");
}
// if we get this far, create a new user from the request body
var newUser = new UserModel(req.body);
// save it and sign it in
newUser.save(function(err) {
if(err) {
console.log("Error during signup: " + err);
return done(err);
}
return done(null, newUser);
});
});
});
}
));
};
我使用这种策略的一种方式是:
'use strict';
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var UserModel = require('mongoose').model('User');
module.exports = function() {
// create our local passport strategy & use it
passport.use(new LocalStrategy({
// use the default names for the username & password fields
usernameField: 'username',
passwordField: 'password'
},
// main strategy function
function(username, password, done) {
// find user with given username
UserModel.findOne({
username: username
},
// with this username, do this
function(err, user) {
// if there's an error, log it then pass it along
if(err) {
console.log("Error during login: " + err);
return done(err);
}
// if the username and/or password is incorrect, return an error
// along with a message
if(!user || !user.authenticate(password)) {
return done(null, false, {
message: 'Invalid username and/or password'
});
}
// if everything is correct, return the user document from the database
return done(null, user);
});
}
));
};
我的“本地”战略定义如下:
'use strict';
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var UserModel = require('mongoose').model('User');
module.exports = function() {
// create our local passport strategy & use it
passport.use(new LocalStrategy({
// use the default names for the username & password fields
usernameField: 'username',
passwordField: 'password'
},
// main strategy function
function(username, password, done) {
// find user with given username
UserModel.findOne({
username: username
},
// with this username, do this
function(err, user) {
// if there's an error, log it then pass it along
if(err) {
console.log("Error during login: " + err);
return done(err);
}
// if the username and/or password is incorrect, return an error
// along with a message
if(!user || !user.authenticate(password)) {
return done(null, false, {
message: 'Invalid username and/or password'
});
}
// if everything is correct, return the user document from the database
return done(null, user);
});
}
));
};
我使用这两种策略,例如:
app.route(pageName).post(function(req, res, next) {
passport.authenticate(strategyName, function(err, user, info) {
if(err || !user) {
res.status(401).send(info);
}
else {
req.login(user, function(err) {
if(err) {
res.status(400).send(err);
}
else {
res.send(null);
}
});
}
})(req, res, next);
});
我试过了
request = require('supertest');
this.authServer = require('../my-server');
request(this.authServer)
.put('/signup')
.set('Content-Type', 'application/json')
.set('Host', 'konneka.org')
.send(this.fullUser)
.end(function(req, res, done) {
console.log(res);
});
我在end()
函数中记录的res
对象(此处显示的太长)上定义了一个req
对象,但它似乎只有在打开请求之前定义的对象和函数。换句话说,它没有req.user
、req.session
,也没有我想要的其他对象,因为它们是在请求完成并启动新请求后定义的。我注意到它还有状态代码,这些代码只有在请求完成后才定义,所以我肯定遗漏了什么
在您正在测试的请求结束后,是否有任何方法可以访问
req
对象?还是我的做法完全错误?您无法使用supertest
执行您想要的操作
不确定这是否有帮助,但我将添加一点上下文来澄清答案:
supertest
是一个位于superagent
(客户端)之上的包装器,它在express
中具有一些基本挂钩,用于启动HTTP侦听器。实际上,这与启动express应用程序、等待它侦听某个端口、向该端口发出HTTP请求并解析结果没有什么不同。事实上,这正是它所做的
因此本质上supertest
只能访问您的客户端可以访问的内容(浏览器或某个API客户端)。换句话说,如果它不在HTTP响应主体中,您将无法访问它req.user
和req.session
是服务器端的状态变量,它们(很可能)不在响应中(除非您正在做一些奇怪的事情)
如果您想以您描述的方式进行测试,您必须使用一些替代的测试策略,而不是
supertest
当我想这样做时,我发现了这个问题,对我来说,检查由请求创建的用户的状态而不是验证req对象的内容效果很好。您确实可以访问完整的数据库,我假设您的用户最终会访问该数据库。您要测试哪种passport策略?这些是oAuth策略(比如Facebook或Twitter登录)还是一些自定义策略?你能发布这些策略的代码和/或配置吗?好的。我没有意识到不同的策略对req.user
或其他什么都很重要。你有什么建议吗?我听说过nock
,但找不到更多其他的。因此,我所想的supertest
在请求之前而不是之后访问请求变量是正确的,但原因与我所想的不同,即supertest
在客户端,而不是服务器。嘿,希望这个答案有用:)!我真的没有一颗银弹给你。我以前没有听说过nock,但是看着github很快告诉我这可能不是答案。我可以分享我的策略,但我不确定这里是否容易解释。理想情况下,从测试中删除HTTP是您真正需要的。在我的例子中,我将express抽象出来,以便能够轻松地测试独立于传输(HTTP)的控制器。这确实是关键:在express介入之前测试函数。不确定这是否有帮助,但我很乐意在聊天中给出进一步的建议:)这很有帮助!我不敢相信他们没有一些库来测试express
的服务器端元素,Maaaa说,这可能是一个骗局,因为这是实现,但有理由测试这一方面<代码>请求用户,例如。也许明天我会在聊天中征求意见。现在我要睡觉了,虽然这里才11点。