Как шпионить за импортированной функцией с помощью Sinon?

Допустим, мы хотим проверить, что определенная функция вызывается другой функцией, использующей Sinon.

fancyModule.js

export const fancyFunc = () => {
  console.log('fancyFunc')
}

export default const fancyDefault = () => {
  console.log('fancyDefault')
  fancyFunc()
}

fancyModule.test.js

import sinon from 'sinon'
import fancyDefault, { fancyFunc } from '../fancyModule'

describe('fancyModule', () => {
  it('calls fancyFunc', () => {
    const spy = sinon.spy(fancyFunc)
    fancyDefault()
    expect(spy.called).to.be.true
  })
})

Когда я запускаю этот тест, фактическое значение всегда ложно. Также оригинальная функция fancyFunc() вызывается (выводит fancyFunc) вместо насмешки.

2 ответа

Вы можете изменить стиль импорта и импортировать свой модуль как объект

import sinon from 'sinon'
import * as myModule from '../fancyModule'

describe('fancyModule', () => {
  it('calls fancyFunc', () => {
    const spy = sinon.spy(myModule, 'fancyFunc');
    myModule.fancyDefault()
    expect(spy.called).to.be.true
  })
})

Вы должны использовать https://github.com/speedskater/babel-plugin-rewire/

import sinon from 'sinon'
import fancyDefault, { __RewireAPI__ } from '../fancyModule'

describe('fancyModule', () => {
  it('calls fancyFunc', () => {
    const spy = sinon.spy()
    __RewireAPI__.__Rewire__('fancyFunc', spy)
    
    fancyDefault()

    expect(spy.called).to.be.true
  })
})

Также проверьте пример: https://github.com/speedskater/babel-plugin-rewire

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