Заглушка конструктора библиотеки вызывает с помощью sinon
До сих пор я использовал sinon, чтобы заглушить вызовы функций для объектов, включенных в мой код nodeJS.
Например, я использую библиотеку запросов, и поэтому в своих тестах я могу отключить http-вызовы, например:
var request = require('request');
//Somewhere further below in my tests:
postStub = sinon.stub(request, 'post');
Теперь я столкнулся со сценарием, в котором библиотека, которую я включаю, должна вызываться примерно так в моем реальном коде:
var archiver = require('archiver');
//Further below in actual code (express middleware)
var zip = archiver('zip');
zip.pipe(res);
Я хочу быть в состоянии заглушить звонки pipe()
в библиотеке архиватора, но я думаю, что мне нужно сначала заглушить вызов конструктора - archiver('zip')
?
У меня был поиск вокруг, и я думаю, что createStubInstance Шинона мог бы помочь мне здесь, но я не уверен на 100%.
Может кто-нибудь помочь? Спасибо
1 ответ
Это не красиво, но то, что я сделал, похоже, работает. Оберните вашу библиотеку с ненадежной функцией другим экспортируемым методом.
file.js
exports.originalMethod = function() {
var archiver = require('archiver');
//Further below in actual code (express middleware)
var zip = exports.newArchiverMethod('zip');
zip.pipe(res);
}
exports.newArchiverMethod = function(arg) {
return archiver(arg);
}
Этот newArchiverMethod может быть заглушен.
spec.js
archiverStub = sinon.stub(controller, 'newArchiverMethod');
Он не идеален, потому что он добавляет новый экспортируемый метод и создает ненужный беспорядок в исходном файле, а также строку, не подлежащую проверке. Но это позволяет вам пройти эту строку и протестировать остальную часть длинного метода.