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

如何在React测试中Mock组件已导入的functionIWantToMock函数?

正确Mock组件中导入函数的方法

你直接赋值修改函数的方式无效,核心原因是组件在导入阶段就绑定了原函数的引用,你在测试文件里修改变量,不会影响组件内部持有的函数引用。下面是两种可行的解决方法:

方案一:Mock整个导入模块

用jest.mock直接指定目标模块的Mock实现,保留其他导出的原始行为,只替换需要Mock的函数:

修改后的component.test.js代码:

import { Component } from "./component";
import { render, screen } from "@testing-library/react";
import { functionIWantToMock } from "somewhere/on/my/hdd";

// Mock目标模块,保留原始导出的其他内容,仅替换functionIWantToMock
jest.mock("somewhere/on/my/hdd", () => ({
  ...jest.requireActual("somewhere/on/my/hdd"),
  functionIWantToMock: jest.fn(() => "empty"),
}));

it("should change the result of the function", () => {
  render(<Component/>);
  // 断言Mock后的返回值已被渲染
  expect(screen.getByText("empty")).toBeInTheDocument();
});

方案二:用Spy单独替换函数实现

如果不想Mock整个模块,只想针对性替换单个函数,可以用jest.spyOn:

修改后的component.test.js代码:

import { Component } from "./component";
import { render, screen } from "@testing-library/react";
import * as myModule from "somewhere/on/my/hdd";

it("should change the result of the function", () => {
  // 创建函数间谍并指定返回值
  const mockFunction = jest.spyOn(myModule, "functionIWantToMock").mockReturnValue("empty");
  
  render(<Component/>);
  
  expect(screen.getByText("empty")).toBeInTheDocument();
  
  // 测试结束后恢复原始函数,避免影响其他测试用例
  mockFunction.mockRestore();
});

这两种方法都是直接修改模块导出的函数引用,所以能覆盖组件内部的调用逻辑,解决你之前遇到的Mock无效问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:54:23