как смоделировать twilio в модульных тестах с помощью sinon/proxyquire или внедрения зависимостей в node.js

Скажем, я хочу протестировать контроллер входа пользователя, который отправляет коды входа через SMS с помощью Twilio. Как мне настроить тест, чтобы я мог издеваться над Twilio и видеть, какие коды он отправляет обратно. Мой подход заключался в том, чтобы проксировать клиентский объект twilio и шпионить за ним с помощью sinon, но я не думаю, что понимаю это правильно.

контроллер user.js

var smsClient = new twilio.RestClient(config.get('twilio_account_sid'), config.get('twilio_auth_token'));

module.exports = {
  checkCode: function(phone){
        var code = getNewCode();
        smsClient.sms.messages.create({
            from: config.get('twilio_phone_number'),
            to: phone,
            body: 'Your code :' + code
        }, callback);
  }
}

тестовый файл

var twilioMock = //what goes here??
var smsSpy = sinon.spy(twilioMock.sms.messages, 'create');
var User = proxyquire('../models/user', { 'mongoose': mongooseMock, 'smsClient': twilioMock }); 

... some describe and it statements ...
twilioMock.sms.messages.should.have.been.calledOnce()  //this is where I don't know what I should be checking

// or is this the right way? 
//smsSpy.should.have.been.calledOnce()

person MonkeyBonkey    schedule 07.03.2015    source источник


Ответы (1)


Я отвечаю на это очень поздно, но это может помочь кому-то.

Я не использовал proxywire, но он очень похож на rewire (просто глядя на ваш код). Вы должны попробовать следующее:

var twilioMock = new twilio.RestClient(config.get('twilio_account_sid'), config.get('twilio_auth_token'));

Я больше привык к перепрошивке. npm i rewire --save-dev. Используя rewire, вы можете попробовать следующее: (концепция остается прежней)

В вашем тесте:

var rewire = require('rewire');
var twilioMock = new twilio.RestClient(config.get('twilio_account_sid'), config.get('twilio_auth_token'));
var userController = rewire('./path_to_user.js') // notice use of rewire

beforeEach(function(){
    this.smsClient = twilioMock; // `this` is available within your tests
    userController.__set__('smsClient', this.smsClient);
});

it('should something', sinon.test(function(){
    var smsSpy = this.spy(this.smsClient.sms.messages, 'create');
}));
person Lucky Soni    schedule 11.07.2016
comment
Я бы добавил два блока this.revert = userController.__set__('smsClient', this.smsClient); в beforeEach и вызов this.revert() в afterEach. - person Alexey Kucherenko; 12.07.2016
comment
будет ли это подключаться к twilio?. - person 0.sh; 05.12.2018