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
相关产品推荐
相关产品推荐

