web-dev-qa-db-fra.com

Comment se moquer du middleware dans Express pour ignorer l'authentification pour le test unitaire?

J'ai ce qui suit dans Express

 //index.js

 var service = require('./subscription.service');
 var auth = require('../auth/auth.service');
 var router = express.Router();

 router.post('/sync', auth.isAuthenticated, service.synchronise);

 module.exports = router;

Je veux remplacer ou se moquer de l'authentification pour retourner ce

auth.isAuthenticated = function(req, res, next) { 
  return next(); 
}

Voici mon test unitaire:

it('it should return a 200 response', function(done) {

  //proxyquire here?

  request(app).post('/subscriptions/sync')
  .set('Authorization','Bearer '+ authToken)
  .send({receipt: newSubscriptionReceipt })
  .expect(200,done);
});

J'ai essayé de se moquer de index.js en utilisant proxyquire - Je pense que je dois bloquer le routeur? J'ai aussi essayé de passer outre au test

app.use('/subscriptions', require('./api/subscription'));

Il doit y avoir un moyen simple de se moquer de cela, donc je n'ai pas besoin d'authentifier la demande. Des idées?

26
jeh

Vous pouvez utiliser sinon pour remplacer la méthode isAuthenticated, mais vous devez le faire avant une référence à auth.isAuthenticated est défini comme middleware, donc avant d'avoir besoin du index.js et app est créé. Vous souhaiterez probablement cela dans un crochet beforeEach:

var app;
var auth;

beforeEach(function() {
  auth = require('../wherever/auth/auth.service');
  sinon.stub(auth, 'isAuthenticated')
      .callsFake(function(req, res, next) {
          return next();
      });

  // after you can create app:
  app = require('../../wherever/index');
});

afterEach(function() {
  // restore original method
  auth.isAuthenticated.restore();
});

it('it should return a 200 response', function(done) {
  request(app).post('/subscriptions/sync')
  .set('Authorization','Bearer '+ authToken)
  .send({receipt: newSubscriptionReceipt })
  .expect(200,done);
});

Veuillez noter que même après auth.isAuthenticated est restauré, l'instance existante de app aura un stub comme middleware, vous devez donc créer une autre instance de app si vous avez besoin d'obtenir un comportement original pour une raison quelconque.

24
Sergey Lapin