在响应后访问Supertest中的“req”对象

在testing请求的同时/之后,有没有什么方法可以直接访问supertest对象中的req对象? 我想testing我的passport策略,所以我想检查req.userreq.session ,也许还有其他的。 我知道我可以testing页面redirect或闪光,因为这些都是我的策略所做的,但看起来req对象上是否有用户似乎也很有用。 如果我这样做,我也可以检查一次有多less用户。

我将使用“本地注册”策略来签署用户,因此定义如下:

 '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); }); } )); }; 

我使用这两种策略,例如:

 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()函数里logging的res对象,在这里显示的时间太长,有一个req对象定义在它上面,但是它似乎只有在请求被打开之前定义的对象和函数。 换句话说,它没有req.userreq.session或其他我想要的对象,因为它们是请求完成之后定义的并且启动了一个新的请求。 我注意到它也有状态代码,这些状态代码只在请求完成后才定义,所以我必须丢失一些东西。

在你正在testing的请求结束之后,有什么方法可以访问req对象吗? 或者我是否完全错误的方式?

你不能用supertest做你想做的supertest

不知道这是否有帮助,但我会添加一点上下文来澄清答案:

supertestsuperagent (客户端)上的一个包装器,带有一些基本的钩子来启动HTTP侦听器。 在底层,与启动你的快速应用程序,等待它在端口上侦听,向这个端口发出一个HTTP请求,以及parsing结果没有任何区别。 事实上,这正是它所做的。

所以基本上supertest只能访问你的客户端可以访问的东西(一个浏览器或者一些API客户端)。 换句话说,如果它不在HTTP响应正文中,您将无法访问它。 req.userreq.sesssion是服务器端状态variables(很可能)不是在响应中(除非你正在做一些奇怪的事情)。

如果你想按照你描述的方式进行testing,你将不得不采用一些可选的testing策略,而不是supertesttesting。

我发现这个问题时,我想我想这样做,对我来说,检查由请求创build的用户的状态,而不是validationreq对象的内容效果很好。 你有权访问完整的数据库,我假设你的用户以某种方式结束。