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