如何在Karma中模拟(mock)JavaScript文件内声明的本地函数
解决方案
本地定义的foo和bar函数的mock方案,取决于两者的作用域范围,常用可行方式如下:
若函数定义在全局作用域(未包裹在闭包、模块内部)
此时foo、bar会默认挂载到window对象上,直接用和mockdocument.A一致的语法即可:// mock foo 函数,可自定义返回值、调用逻辑 sandbox.stub(window, 'foo').returns('mock 结果'); // mock bar 函数同理 sandbox.stub(window, 'bar').callsFake(() => { // 自定义 mock 逻辑 });测试完成后sandbox会自动恢复原有函数实现。
若函数定义在ES模块/CommonJS模块内部
你需要先将两个函数从模块中导出,之后对导出的模块方法进行stub即可:
原模块代码示例:// yourModule.js const varA = document.A; // 调用foo、bar的逻辑 export function runLogic() { foo(); bar(); return varA; } export function foo() {} export function bar() {}测试代码示例:
import * as yourModule from './yourModule.js'; // stub 模块导出的foo方法 sandbox.stub(yourModule, 'foo').returns('mock值');若为不对外导出的模块内部私有函数
没有直接从外部mock的方案,你可以改造原代码,将依赖改为可注入形式:把foo、bar作为上层逻辑的可选参数传入,默认值为原本地函数,测试时直接传入自定义mock函数即可,无需依赖stub工具:
改造后代码示例:// 原调用foo、bar的逻辑 function runLogic(fooImpl = foo, barImpl = bar) { fooImpl(); barImpl(); return varA; }
内容的提问来源于stack exchange,提问作者v.slobodzian
相关产品推荐
相关产品推荐

