Sinon - Как заглушить библиотеку аутентификации (Authy -Twilio)

В настоящее время я новичок в Sinon, Mocha, Supertest и в процессе написания тестов. В моем текущем сценарии у меня есть библиотека аутентификации, которая проверяет мой "OTP", и после проверки он выполняет операцию в функции обратного вызова.

Я не могу смоделировать обратный вызов, чтобы вернуть ноль и продолжить тестирование остальной части кода. Ниже приведен мой фрагмент кода:

Controller.js


var authy = require('authy')(sails.config.authy.token);
 authy.verify(req.param('aid'), req.param('oid'), function(err, response) {
  console.log(err);
  if (err) {
    return res.badRequest('verification failed.');
  }
....

Мой тест:

 var authy = require('authy')('token');



describe('Controller', function() {
  before(function() {
    var authyStub = sinon.stub(authy, 'verify');
    authyStub.callsArgWith(2, null, true);
  });

  it('creates a test user', function(done) {
    // This function will create a user again and again.
    this.timeout(15000);
    api.post('my_endpoint')
      .send({
        aid: 1,
        oid: 1
      })
      .expect(201, done);


  });
});

По сути, я хочу вызвать authy verify, чтобы получить null как "err" в обратном вызове, поэтому я могу протестировать остальную часть кода.

Любая помощь будет высоко оценен. Спасибо

1 ответ

Проблема в том, что вы используете разные экземпляры authy объект в ваших тестах и ​​ваш код. Смотрите здесь Authy GitHub репо.

В вашем коде вы делаете

var authy = require('authy')(sails.config.authy.token);

и в вашем тесте

var authy = require('authy')('token');

Так что ваша заглушка в целом нормальная, но она никогда не будет работать так, потому что ваш код не использует заглушку.

Выход состоит в том, чтобы authy Экземпляр в вашем контроллере для впрыскивания извне. Что-то вроде этого:

function Controller(authy) {
    // instantiate authy if no argument passed

в ваших тестах вы можете сделать

describe('Controller', function() {
    before(function() {
        var authyStub = sinon.stub(authy, 'verify');
        authyStub.callsArgWith(2, null, true);
        // get a controller instance, however you do it
        // but pass in your stub explicitly
        ctrl = Controller(authyStub);
    });
});
Другие вопросы по тегам