13

リクエストがテストされている間/後に、reqオブジェクトに直接アクセスする方法はありますか? 私は自分の戦略supertestをテストしたいので、 、、そしておそらく他のものをチェックしたいと思います。ページのリダイレクトやフラッシュをテストできることは知っていますが、それらは私の戦略が行っていることですが、オブジェクトにユーザーがいるかどうかを確認することも役立つようです。これを行うと、一度に何人のユーザーがいるかを確認することもできます.passportreq.userreq.sessionreq

このように定義されている「ローカルサインアップ」戦略でユーザーをサインアップします。

'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()reqreq.userreq.session

reqテスト中のリクエストが終了した後にオブジェクトにアクセスする方法はありますか? それとも、私はこれを完全に間違った方法で行っていますか?

4

2 に答える 2

16

を使用してやりたいことを行うことはできませんsupertest

これが役立つかどうかはわかりませんが、答えを明確にするために少しコンテキストを追加します。

supertestHTTPリスナーを起動するためのsuperagentいくつかの基本的なフックを備えた(クライアント側)のラッパーです。express内部的には、エクスプレス アプリを起動し、ポートでリッスンするのを待ち、そのポートに HTTP 要求を送信し、結果を解析することと実際には何の違いもありません。実際、それはまさにそれがすることです。

したがって、基本的supertestに、クライアントがアクセスできるもの (ブラウザーまたは一部の API クライアント) にのみアクセスできます。つまり、HTTP 応答本文に含まれていない場合は、アクセスできません。 req.userそして、req.sesssion(おそらく)応答に含まれていないサーバー側の状態変数です(何か奇妙なことをしていない限り)。

説明したとおりにテストしたい場合は、テストではなく、別のテスト戦略を使用する必要がありますsupertest

于 2014-11-07T22:51:01.483 に答える