如何使用 Sinon 监视导入的函数?

Mar*_*arc 6 javascript mocha.js sinon chai es6-modules

假设我们想测试一个特定的函数是否被另一个使用 Sinon 的函数调用。

花式模块.js

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

export default const fancyDefault = () => {
  console.log('fancyDefault')
  fancyFunc()
}
Run Code Online (Sandbox Code Playgroud)

花式模块.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
  })
})
Run Code Online (Sandbox Code Playgroud)

当我运行此测试时,实际值始终为false。此外,原始函数fancyFunc()被调用(输出fancyFunc)而不是被模拟

小智 6

您可以更改导入样式,并将您的模块作为这样的对象导入

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
  })
})
Run Code Online (Sandbox Code Playgroud)


Ale*_*nko 2

您应该使用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
  })
})
Run Code Online (Sandbox Code Playgroud)

另外,检查示例:https ://github.com/speedskater/babel-plugin-rewire#test-code-2