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

在Jest中Mock单个React Hook时,如何避免Mock同文件夹所有Hook?

如何仅Mock同文件夹下的指定React Hook

你当前的问题是jest.mock替换了整个模块的所有导出,导致同文件的secondHook也被意外Mock。以下是两种可行的解决方法:

方法一:保留原模块的其他导出

使用jest.requireActual获取模块的真实导出,仅替换需要Mock的Hook:

jest.mock("this/location/has/both/hooks", () => ({
  // 展开原模块的所有真实导出
  ...jest.requireActual("this/location/has/both/hooks"),
  // 仅Mock目标Hook
  firstHook: jest.fn(),
}))

这样secondHook会保持原有的真实实现,不会被影响。

方法二:拆分Hook到单独文件(推荐长期维护)

将两个Hook分别放在独立的文件中:

  • src/hooks/firstHook.js
  • src/hooks/secondHook.js

测试时直接Mock目标Hook的单独文件:

jest.mock("this/location/has/firstHook", () => ({
  firstHook: jest.fn(),
}))

这种方式更清晰,避免模块导出冲突,也方便后续的测试和维护。

完整测试代码示例

jest.mock("this/location/has/both/hooks", () => ({
  ...jest.requireActual("this/location/has/both/hooks"),
  firstHook: jest.fn(),
}))

describe("testHook", () => {
  beforeEach(() => {
    firstHook.mockImplementation(() => {})
  })

  test("this is a test", () => {
    const { result } = renderHook(() => secondHook({ param1, param2 }))

    expect(result.current.property).toBe(something)
  })
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:09:25