testingexpression中间件

我有以下代码来testing:

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; 

我的testing文件:

 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对象错了?

我现在发现了以下解决scheme:

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