如何在Jasmine测试中Mock导出的TypeScript函数?
解决Jasmine中Mock TypeScript导出函数的问题
你遇到的问题其实很常见——在同一个模块里的函数互相调用时,直接mock导入的函数可能不会生效,因为bar内部调用的是模块自身的foo引用,而不是你直接导入后修改的那个。不过用Jasmine的spyOn就能轻松搞定,具体步骤如下:
首先,保持你对整个模块的导入方式不变:import * as demo from './demo';,然后在测试bar的用例里,通过spyOn来替换模块上的foo方法,指定它的返回值。
这里是修正后的完整测试代码:
import * as demo from './demo'; describe('demo模块的函数测试', () => { describe('foo函数', () => { it('应该返回2', () => { expect(demo.foo('任意输入')).toBe(2); }); }); describe('bar函数', () => { it('应该使用Mock的foo函数并返回3', () => { // 创建foo函数的Spy,并指定返回值为1 const fooSpy = spyOn(demo, 'foo').and.returnValue(1); const result = demo.bar('测试输入'); // 断言结果是1+2=3 expect(result).toBe(3); // 同时验证foo确实被传入正确参数调用了 expect(fooSpy).toHaveBeenCalledWith('测试输入'); }); }); });
原理说明
当你用spyOn(demo, 'foo')时,Jasmine会把demo模块对象上的foo属性替换成一个间谍函数。因为在同一个TypeScript模块里,bar内部调用的foo(input)本质上是在引用demo.foo(模块导出的版本),所以这个mock会直接生效,bar调用的就是你设置的间谍函数了。
内容的提问来源于stack exchange,提问作者Sevenless
相关产品推荐
相关产品推荐

