使用Jest spyOn监听同文件内部函数失败,调用次数为0如何解决?
问题根因
jest.spyOn监听的是导出的functions对象上挂载的bar方法,而foo函数内部直接调用的是functions.js文件作用域下声明的局部bar函数,两者只是初始值指向同一个函数实体,属于完全独立的两个引用。你调用functions.foo()时触发的是局部bar的执行,没有触发你监听过的functions.bar,因此调用次数统计为0。
另外你原代码的导出语法存在错误,export functions = {缺少变量声明关键字,需修正为export const functions = {才能正常运行。
解决方案
方案1:最小改动适配监听逻辑
修改foo内部调用逻辑,调用当前执行上下文的bar方法,触发你监听的对象方法:
// functions.js 修改后 function bar() { return 'bar'; } function foo() { return this.bar(); } export const functions = { bar, foo, };
测试代码无需改动,直接运行即可通过。
方案2:拆分导出避免作用域问题
将方法单独导出,直接监听模块导出的方法引用:
// functions.js 修改后 export function bar() { return 'bar'; } export function foo() { return bar(); }
测试代码调整为监听模块导出对象:
// functions.test.js 修改后 import * as funcModule from './functions.js'; describe('test foo', () => { it('should call bar', () => { const spy = jest.spyOn(funcModule, 'bar'); funcModule.foo(); expect(spy).toHaveBeenCalled(); }); });
方案3:不改动业务代码适配测试
直接在测试时绑定foo的执行上下文为导出的functions对象:
// functions.test.js 修改后 import {functions} from './functions.js'; describe('test foo', () => { it('should call bar', () => { const spy = jest.spyOn(functions, 'bar'); functions.foo.bind(functions)(); expect(spy).toHaveBeenCalled(); }); });
内容的提问来源于stack exchange,提问作者qwerty
相关产品推荐
相关产品推荐

