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

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

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

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

Вот мой модульный тест:

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

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


person jeh    schedule 02.02.2017    source источник


Ответы (1)


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

Обновление: есть способ изменить поведение промежуточного программного обеспечения без повторного создания сервера каждый раз, как описано в другом ответе SO< /а>.

person Sergey Lapin    schedule 02.02.2017
comment
@LukeSchlangen разместил там ответ - person Sergey Lapin; 19.12.2018
comment
@SergeyLapin Есть ли способ имитировать параметризованное промежуточное ПО с помощью Sinon? определение промежуточного программного обеспечения, например: - person H_H; 18.05.2020
comment
@hareshhanat конечно, я так же считаю, просто нужно вернуть промежуточное ПО вместо того, чтобы передавать его в callFake: sinon.stub(authModule, 'authUser') .callsFake((options) =› (req, res, next) =› { вернуть следующий(); }); - person Sergey Lapin; 19.05.2020
comment
@SergeyLapin Да, понял. Большое спасибо!! - person H_H; 19.05.2020