Пакет Twilio npm возвращает функцию, которая создает новый объект при каждом вызове , это , а не singleton .Таким образом, ваш закороченный экземпляр twilio предназначен только для теста.
Также twilio.recordings
(как и все другие свойства) определяется через функцию-получатель в прототипе , поэтому они только для чтения :
Object.defineProperty(Twilio.prototype,
'recordings', {
get: function() {
return this.api.account.recordings;
}
});
Таким образом, фактический экземпляр twilio не работает.За исключением случаев, когда вы меняете прототип экземпляра , но я не думаю, что это стоит делать просто для модульного тестирования.
Я бы предложил вам провести рефакторинг вашего кода, чтобы поместить инициализацию twilio в отдельный метод:
function getTwilio() {
return require('twilio')(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);
}
Далее ваш hangleMessage
будет выглядеть следующим образом:
function handleMessage() {
const twilio = this.getTwilio();
const recordings = twilio.recordings(...);
...
}
И затем, в вашем тесте вы можете заглушить getTwilio()
, чтобы вернуть заглушку:
const twilioStub = {
recordings: sinon.stub(),
remove: sinon.stub()
}
sinon.stub(myAwesomeModule, 'getTwilio').returns(twilioStub);
Вы также можете рассмотреть возможность использования пакета mock-require :
const sinon = require('sinon');
const mock = require('mock-require');
mock('twilio', () => ({
recordings: sinon.stub(),
}));
Здесь - вопрос о том, как смоделировать зависимости , могут быть другие полезныебиблиотеки, чтобы заглушить необходимый модуль.
Надеюсь, это поможет.