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

Jest如何Mock返回对象的getSettings函数以修改其foo属性返回值

错误原因

你的写法存在两个问题:

  • jest.spyOn(getSettings, 'foo')的用法不符合API规范:jest.spyOn第一个参数是挂载目标方法的对象,第二个参数是对象上的方法名。getSettings本身是独立函数,不存在foo这个方法属性,直接调用会触发报错。
  • 你mock返回的是{value: '123'},但业务代码里解构的是返回对象的foo属性,就算spy逻辑生效也拿不到预期值。

正确实现方案

根据getSettings的引入场景区分两种写法:

场景1:getSettings从外部模块导入

比如两个函数都定义在config.js中,测试文件从该模块导入依赖,写法如下:

// 先把整个模块导入为对象,才能spy其中的导出方法
import * as config from './config.js'

it('测试myFunction读取自定义foo值', () => {
  const expectedValue = '123'
  // spy getSettings方法,mock其返回值
  jest.spyOn(config, 'getSettings').mockReturnValue({
    foo: expectedValue
  })

  const result = config.myFunction()
  expect(result).toBe(expectedValue)

  // 可选:测试结束后恢复原函数,避免影响其他用例
  config.getSettings.mockRestore()
})

场景2:两个函数在同一测试文件内

无法直接spy当前文件声明的独立函数,需要把函数挂载到公共对象上再导出:

// 原业务代码调整,把函数挂到导出对象上
export const utils = {
  getSettings() {
    return { foo: 'bar' }
  },
  myFunction() {
    const { foo } = utils.getSettings()
    return foo
  }
}

// 测试代码
it('测试myFunction读取自定义foo值', () => {
  const expectedValue = '123'
  jest.spyOn(utils, 'getSettings').mockReturnValue({
    foo: expectedValue
  })

  const result = utils.myFunction()
  expect(result).toBe(expectedValue)
  utils.getSettings.mockRestore()
})

全局替换函数的写法

如果整个测试文件都需要用mock的getSettings,也可以直接用jest.mock替换整个模块:

jest.mock('./config.js', () => ({
  // 保留模块其他原逻辑,只替换getSettings
  ...jest.requireActual('./config.js'),
  getSettings: jest.fn(() => ({
    foo: '123'
  }))
}))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:09:04