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

如何在Jest中mock模块内部返回对象的函数调用 解决类型报错问题

解决步骤

核心问题说明

  • jest.mock()的返回值是jest全局对象本身,并非你在工厂函数中定义的mock实例,直接将其作为mockReturnValue的入参会触发类型不匹配错误。
  • toThrowError()断言要求入参为待执行的函数引用,直接执行目标函数会导致错误直接抛出、终止测试,无法命中断言。
  • 你已经通过spyOn mock了food方法的返回值,调用taste时不会触发真实的new Fruit()逻辑,因此原代码中全局mockfruit模块的代码属于冗余内容,可以直接删除。

修正后的测试代码

你改写的Sample.ts自导入逻辑不需要调整,仅修改测试代码即可:

test('taste 方法在getTaste抛错时同步抛出错误', () => {
  const sample = require('./sample');
  // 构造符合预期的mock Fruit实例,仅需实现用例中用到的方法
  const mockFruitInstance = {
    getTaste: jest.fn(() => {
      throw new Error("Test Error");
    })
  };
  // 替换food方法的返回值为mock实例
  jest.spyOn(sample, 'food').mockReturnValue(mockFruitInstance);
  // 传入函数引用给expect,由jest执行并捕获抛出的错误
  expect(() => sample.taste()).toThrowError("Test Error");
})

可选方案:全局mock Fruit类

如果你的其他测试用例需要统一mock Fruit模块,可使用如下写法,此时不需要单独mockfood方法:

// 放在测试文件顶部,jest会自动提升该代码到所有import之前执行
jest.mock("./fruit", () => ({
  // 若Fruit为命名导出则替换为对应导出名
  default: jest.fn().mockImplementation(() => ({
    getTaste: jest.fn(() => {
      throw new Error("Test Error");
    }),
    promise: jest.fn()
  }))
}));

test('taste 方法在getTaste抛错时同步抛出错误', () => {
  const sample = require('./sample');
  expect(() => sample.taste()).toThrowError("Test Error");
})

内容的提问来源于stack exchange,提问作者nfornicole

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:54:07