响应后访问Supertest中的"req"对象

try*_*sis 8 node.js express supertest passport.js

在测试请求时/之后是否有任何方法可以直接访问req对象supertest?我想测试我的passport策略,所以我想检查一下req.user,req.session或许还有其他人.我知道我可以测试页面重定向或flash,因为这些是我的策略所做的,但是看看req对象上是否还有用户似乎很有用.如果我这样做,我还可以检查一次有多少用户.

我将使用"local-signup"策略对用户进行签名,该策略由此定义:

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

                });

            });

        }

    ));

};
Run Code Online (Sandbox Code Playgroud)

我使用这种策略的一种方法是这样的:

我的"本地"策略定义如下:

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

            });
        }

    ));
};
Run Code Online (Sandbox Code Playgroud)

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

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);
});
Run Code Online (Sandbox Code Playgroud)

我试过了

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);
    });
Run Code Online (Sandbox Code Playgroud)

res我在end()函数内部记录的对象,这里显示的时间太长,在req其上定义了一个对象,但似乎只有在打开请求之前定义的对象和函数.换句话说,它不具备req.user,req.session或其他对象我想要的,因为它们被定义后,请求完成和新的请求启动.我注意到它也有状态代码,它们只在请求完成后定义,所以我必须遗漏一些东西.

req在您测试的请求结束后,有没有办法访问该对象?或者我完全以错误的方式解决这个问题?

mat*_*ttr 11

你无法做你想要的事情supertest.

不确定这是否有帮助,但我会添加一些背景来澄清答案:

supertest是一个包装在superagent(客户端)的顶部,带有一些基本的钩子express来启动HTTP监听器.在引擎盖下,它与启动您的快速应用程序,等待它侦听端口,向该端口发出HTTP请求以及解析结果没有任何不同.事实上,这正是它的作用.

因此,基本上supertest只能访问您的客户端可以访问的内容(浏览器或某些API客户端).换句话说,如果它不在HTTP响应主体中,您将无法访问它. req.user并且req.sesssion是服务器端状态变量(很可能)不在响应中(除非你做了一些奇怪的事情).

如果您想要完全按照您描述的方式进行测试,则必须使用一些替代的测试策略,而不是supertest.