Как обмануть промежуточное ПО в Express, чтобы пропустить аутентификацию для unit test?

У меня есть следующее в 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;

Я хочу переопределить или mock isAuthenticated, чтобы вернуть это

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

Вот мой unit test:

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

Я пробовал насмехаться index.js с помощью proxyquire - мне кажется, мне нужно заглушить маршрутизатор? Я также попытался переопределить в тесте

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

Должен быть простой способ издеваться над этим, поэтому мне не нужно аутентифицировать запрос. Любые идеи?

Ответ 1

Вы можете использовать метод sinon для заглушки isAuthenticated, но вы должны сделать это до того, как ссылка на auth.isAuthenticated будет установлена ​​как промежуточное программное обеспечение, поэтому перед тем, как вы создадите index.js и app. Скорее всего, вы захотите этого в hook 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);
});

Обратите внимание, что даже после восстановления auth.isAuthenticated существующий экземпляр app будет иметь заглушку в качестве промежуточного программного обеспечения, поэтому вам нужно создать другой экземпляр app, если по какой-то причине вам нужно получить оригинальное поведение.