1

テストする次のコードがあります。

const Status = require('http-status-codes');
const passport = require('passport');
const Users = require('../models/users.js');

const authentication = {
    // Authenticate User Middleware
    authenticateUser: function authenticateUser(req, res, next) {
        return passport.authenticate('bearer', { session: false, failWithError: false },
            (err, user, info) => {
                if (err) {
                    return res.status(500).json({ message: err });
                }

                if (user) {
                    return Users.findOne({ auth_ref: user.auth_ref })
                        .populate('groups')
                        .exec((e, doc) => {
                            if (e) {
                                return res.status(500).json({ message: e });
                            }
                            req.authInfo = info;
                            req.user = doc;
                            return next(null, doc, info);
                        });
                }
                return res.status(Status.UNAUTHORIZED).json({ message: 'Access denied' });
            }
        )(req, res, next);
    },
};

module.exports = authentication.authenticateUser;

私のテストファイル:

const test = require('ava');
const sinon = require('sinon');
const proxyquire = require('proxyquire');

const Util = require('../util');

Util.beforeEach(test, (t) => {
    const authenticateStub = sinon.stub();
    const passportStub = {
        authenticate: authenticateStub,
    };
    const authenticationMocked = proxyquire('../../../middleware/authentication', { passport: passportStub });
    t.context.authenticateStub = authenticateStub;
    t.context.authenticationMocked = authenticationMocked;
});
Util.afterEach(test);
Util.after(test);

test('[middleware/authentication] authenticateUser function call succeed', sinon.test(async (t) => {
    // given
    const func = t.context.authenticationMocked;
    t.context.authenticateStub.withArgs(sinon.match.any, sinon.match.any, sinon.match.any).yields('error', { statusCode: 500 }, 'sampleUser');
    const nextSpy = sinon.spy();

    const fakeReq = { user: { email: '' } };
    const res = {
        status: () => res,
        json: () => res,
    };
    // when
    func(fakeReq, res, nextSpy);
    // then
})

私の問題は、エラーが発生しないように res パラメータを何らかの方法でモックできないことです。このコードは次のエラーを生成します。

  Rejected promise returned by test. Reason:

  TypeError {
    message: 'passport.authenticate(...) is not a function',   }

resオブジェクトを削除すると{}、エラーが発生しますres.status is not a function

初期化に何か問題がありますか、それともresオブジェクトが間違っていますか?

4

1 に答える 1

0

私は今、次の解決策を見つけました:

// given
const func = t.context.authenticationMocked;
t.context.authenticateStub.withArgs(sinon.match.any, sinon.match.any, sinon.match.any).yields('error', { statusCode: 500 }, 'sampleUser').returns(() => {});
const nextSpy = sinon.spy();

const fakeReq = { user: { email: '' } };
const rootRouteStub = {
    status: sinon.stub(),
    json: sinon.spy(),
};
rootRouteStub.status.returns(rootRouteStub);
// when
func(fakeReq, rootRouteStub, nextSpy);
于 2017-09-19T07:34:27.723 に答える