在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.jssrc/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
相关产品推荐
相关产品推荐

