Заглушка конструктора библиотеки вызывает с помощью 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');

Он не идеален, потому что он добавляет новый экспортируемый метод и создает ненужный беспорядок в исходном файле, а также строку, не подлежащую проверке. Но это позволяет вам пройти эту строку и протестировать остальную часть длинного метода.

Другие вопросы по тегам