NodeJS(v9.6.1)下使用Jasmine监视导出函数遇阻求助
解决Jasmine监视TypeScript导出函数的问题
嗨,我之前也碰到过类似的问题,在TypeScript+NodeJS环境下用Jasmine监视模块导出的函数,确实容易踩坑。下面给你几个实用的解决办法:
核心思路:通过模块对象监视导出函数
TypeScript编译后,命名导出的函数会挂载在模块的exports对象上,直接导入单个函数再监视是行不通的——因为你拿到的只是函数的局部引用,Jasmine没法追踪到模块里的原始导出。正确的做法是导入整个工具模块,然后监视模块对象上的目标函数。
具体步骤
测试文件里导入整个工具模块
不要单独导入getData,而是用import * as的方式导入整个模块:import * as FooUtils from '../utils/foo.utils'; import { Bar } from '../bar';创建并配置间谍
用spyOn方法监视模块上的getData函数,还可以设置它的返回值或者模拟行为:describe('Bar类测试', () => { it('应该正确调用getData函数', () => { // 创建间谍并指定返回值 const getDataSpy = spyOn(FooUtils, 'getData').and.returnValue('模拟的数据'); // 实例化Bar并调用用到getData的方法 const barInstance = new Bar(); barInstance.someMethodThatUsesGetData(); // 假设Bar里有这个方法 // 验证间谍是否被调用 expect(getDataSpy).toHaveBeenCalled(); // 还可以验证调用参数 expect(getDataSpy).toHaveBeenCalledWith('你预期的文件路径'); }); });
额外注意事项
- tsconfig.json配置:确保你的
compilerOptions里module设置为commonjs,因为NodeJS v9.6.1对ES模块的支持还不够完善,Jasmine在CommonJS环境下能更好地处理模块导出:{ "compilerOptions": { "module": "commonjs", "target": "es6", "outDir": "./dist", "sourceMap": true } } - 异步函数的处理:你代码里的
readFile是异步函数,但getData直接调用后就返回了,这可能会导致实际运行时的问题。如果后续需要处理异步逻辑,可以把getData改成返回Promise,然后用Jasmine的async/await来测试。
内容的提问来源于stack exchange,提问作者arso
相关产品推荐
相关产品推荐

