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

如何解决Mock常量时出现的TypeError: jest.replaceProperty不是函数问题

如何在Jest中Mock常量文件的属性

问题原因

你遇到的jest.replaceProperty找不到的问题,核心原因是你的Jest版本低于29.0.0——这个API是Jest 29才新增的,低版本Jest不支持该方法,对应的@types/jest类型定义也没有这个导出。

解决方案

方案1:升级Jest到29+

如果可以升级依赖,这是最规范的解决方式:

  1. 升级Jest及对应类型定义:
    # npm 命令
    npm install jest@latest @types/jest@latest --save-dev
    
    # yarn 命令
    yarn add jest@latest @types/jest@latest --dev
    
  2. 升级后正确使用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);
});

纠正你最初的错误用法

你第一次尝试的代码存在两个关键问题:

  1. jest.mock的返回值并非可用的mock对象,不能直接赋值给constsMock调用;
  2. jest.spyOn仅能监听函数,无法监听普通属性,这是报错的直接原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 17:12:19