2017-09-18 1 views
1

je code suivant à tester:test middleware express

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; 

Mon fichier de test:

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 
}) 

Mon problème est que je peux en quelque sorte moquez pas le paramètre res d'une manière de sorte qu'aucune erreur se produit. Ce code produit l'erreur suivante:

Rejected promise returned by test. Reason: 

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

Si je supprime l'objet res à {} l'erreur est res.status is not a function

Ai-je fait quelque chose de mal avec l'initialisation ou est mon objet res mal?

Répondre

0

I maintenant trouvé la solution suivante:

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