リクエストのテスト中/テスト後req
にsupertest
、でオブジェクトに直接アクセスする方法はありますか?私は私のテストしたいpassport
の戦略を、私は確認したいreq.user
、req.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);
});
});
});
}
));
};
この戦略を使用する1つの方法は、次のとおりです。
私の「ローカル」戦略は次のように定義されています。
'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);
});
res
私がログインしたオブジェクトは、内部でend()
ここに表示するにはあまりにも長い道のりだった機能、持っているreq
それに定義されたオブジェクトを、それだけで定義されたオブジェクト&機能持っていると思われる前に、要求が開かれましたが。言い換えれば、それは持っていないreq.user
、req.session
またはそれらが定義されているため、他のオブジェクトは、私が、欲しいの後にリクエストが完了すると、新しい要求が開始されます。リクエストが完了した後にのみ定義されるステータスコードもあることに気づいたので、何かが足りないに違いありません。
req
テストしているリクエストが終了した後、オブジェクトにアクセスする方法はありますか?それとも私はこれを完全に間違った方法で行っていますか?
を使用してやりたいことを行うことはできませんsupertest
。
これが役立つかどうかはわかりませんが、答えを明確にするために少しコンテキストを追加します。
supertest
superagent
(クライアント側)の上にあるラッパーでありexpress
、HTTPリスナーを起動するためのいくつかの基本的なフックがあります。内部的には、Expressアプリを起動し、ポートでリッスンするのを待って、そのポートにHTTPリクエストを送信し、結果を解析するのとまったく同じです。実際、それはまさにそれが行うことです。
したがって、基本的にsupertest
は、クライアントがアクセスできるもの(ブラウザーまたは一部のAPIクライアント)にのみアクセスできます。つまり、HTTP応答本文にない場合は、アクセスできません。req.user
およびreq.sesssion
はサーバー側の状態変数であり、(ほとんどの場合)応答に含まれていません(何か奇妙なことをしている場合を除く)。
説明したとおりにテストする場合は、ではなく、テストの代替戦略を使用する必要がありますsupertest
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加