sinon: заглушить функцию, которая не привязана к объекту

Я пытаюсь использовать sinon, чтобы отключить некоторые функции simplegit. Проблема в том, что simplegit ведет себя очень раздражающе: require('simple-git') возвращает функцию, которую нужно вызвать, чтобы получить действительно полезный объект. Результатом этого является то, что вы каждый раз получаете новый объект, делая заглушку синоном (обычный способ) невозможным.

Поэтому мне нужно заглушить функцию, возвращаемую require('sinon'), чтобы я мог полностью переопределить поведение simplegit. По сути, я хочу сделать что-то вроде этого (но это не работает):

const sinon = require('sinon')
var simplegit = require('simple-git')

//I'm well aware that this isn't valid
sinon.stub(simplegit).callsFake(function() {
  return {
    silent: function() {return this},
    pull: function() {console.log('pulled repo'); return this},
    clone: function() {console.log('cloned repo'); return this}
  }
}

external_function() //this function calls simplegit

Это приведет к созданию объекта, который имеет нужные мне функции, но ничего не делает. Он полностью избегает реальной реализации simplegit.

Возможно ли это сделать?


person ewok    schedule 06.11.2017    source источник
comment
Существуют различные инструменты, которые делают это возможным, например mock-require, издевательство, proxyquire, babel-plugin-rewire. Я бы порекомендовал mock-require, это то, что я использовал до того, как переключился с Mocha на Jest   -  person Patrick Hund    schedule 06.11.2017
comment
Я на самом деле использую шутку. Похоже, вы говорите, что у шутки есть встроенный способ сделать это?   -  person ewok    schedule 06.11.2017
comment
Кроме того, не могли бы вы привести пример для proxyquire или mock-require? Похоже, что это те типы инструментов, которые мне нужны, но опять же, я могу понять, как заглушить, когда вызов require возвращает объект, но проблема в том, что require('simple-git') возвращает функцию, и я не могу это понять   -  person ewok    schedule 06.11.2017
comment
Безусловно, у Jest есть встроенный способ обработки этого варианта использования. Я посмотрю, смогу ли я придумать для тебя ответ   -  person Patrick Hund    schedule 06.11.2017


Ответы (1)


Поскольку вы используете Jest, это просто и даже не требует Sinon. Вы можете просто использовать jest.mock, например, вот так:

jest.mock('simple-git', () => function() {
  return {
    silent: function() {return this},
    pull: function() {console.log('pulled repo'); return this},
    clone: function() {console.log('cloned repo'); return this}
  }
})

→ См. документацию Jest.

Когда я учился использовать Jest, я создал репозиторий GitHub с некоторыми примерами кода, возможно, они вам пригодятся:

https://github.com/pahund/hello-jest

person Patrick Hund    schedule 06.11.2017
comment
используя это, require('simple-git') по-прежнему возвращает функцию, но эта функция ничего не возвращает, а не объект с имитируемыми функциями - person ewok; 06.11.2017
comment
Трудно сказать, почему это не работает для вас, не видя вашего кода. Может быть, вы можете привести минимальный пример? - person Patrick Hund; 06.11.2017
comment
я понял. Я использовал simple-git/promise, а не simple-git. Спасибо за вашу помощь - person ewok; 06.11.2017
comment
@ewok Не могли бы вы показать пример, как вы ее решили? - person terjekid; 07.02.2018