gpt4 book ai didi

node.js - 响应后在超测中访问 "req"对象

转载 作者:搜寻专家 更新时间:2023-10-31 22:19:41 25 4
gpt4 key购买 nike

有什么方法可以在supertest中直接访问req对象,同时/在测试请求之后?我想测试我的 passport 策略,所以我想检查 req.userreq.session,也许还有其他。我知道我可以测试页面重定向或闪存,因为这些是我的策略所做的,但是查看 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);

});
}

));
};

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

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.userreq.session,或者其他我想要的对象,因为它们是在请求之后定义的完成并开始新的请求。我注意到它也有状态代码,这些代码仅在请求完成后定义,所以我一定遗漏了一些东西。

在您正在测试的请求结束后,是否有任何方法可以访问 req 对象?还是我的做法完全错误? p>

最佳答案

你不能使用supertest做你想做的事。

不确定这是否有帮助,但我会添加一些上下文来阐明答案:

supertestsuperagent(客户端)之上的包装器,带有一些基本的钩子(Hook)到 express 中以启动 HTTP 监听器。在幕后,这与启动您的 Express 应用程序、等待它监听端口、向该端口发出 HTTP 请求并解析结果并没有什么不同。事实上,这正是它的作用。

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

如果你想完全按照你描述的方式进行测试,你将不得不使用一些替代的测试策略,而不是supertest

关于node.js - 响应后在超测中访问 "req"对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26794541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com