如何解决Mock常量时出现的TypeError: jest.replaceProperty不是函数问题
如何在Jest中Mock常量文件的属性
问题原因
你遇到的jest.replaceProperty找不到的问题,核心原因是你的Jest版本低于29.0.0——这个API是Jest 29才新增的,低版本Jest不支持该方法,对应的@types/jest类型定义也没有这个导出。
解决方案
方案1:升级Jest到29+
如果可以升级依赖,这是最规范的解决方式:
- 升级Jest及对应类型定义:
# npm 命令 npm install jest@latest @types/jest@latest --save-dev # yarn 命令 yarn add jest@latest @types/jest@latest --dev - 升级后正确使用
jest.replaceProperty的示例:import * as consts from './consts'; test('修改常量值', () => { jest.replaceProperty(consts, 'myConst', true); expect(consts.myConst).toBe(true); });
方案2:不升级Jest,用Object.defineProperty替代
如果无法升级依赖,可以直接通过Object.defineProperty修改只读的导出属性:
import * as consts from './consts'; test('不升级Jest修改常量', () => { Object.defineProperty(consts, 'myConst', { value: true, writable: true, // 开启可写权限 configurable: true // 允许重新定义属性 }); expect(consts.myConst).toBe(true); });
方案3:直接用jest.mock全局Mock模块
如果需要在整个测试文件中固定mock该常量,推荐用jest.mock工厂函数,保留原有其他常量的同时修改目标属性:
// 先执行mock,再导入模块 jest.mock('./consts', () => ({ // 保留原文件的其他常量 ...jest.requireActual('./consts'), // 修改目标常量值 myConst: true })); import * as consts from './consts'; test('全局Mock常量', () => { expect(consts.myConst).toBe(true); });
纠正你最初的错误用法
你第一次尝试的代码存在两个关键问题:
jest.mock的返回值并非可用的mock对象,不能直接赋值给constsMock调用;jest.spyOn仅能监听函数,无法监听普通属性,这是报错的直接原因。
内容的提问来源于stack exchange,提问作者Avtar
相关产品推荐
相关产品推荐

