You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:34:49