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

如何Mock自定义Hook导出函数?测试遇TypeError问题求助

解决Jest Mock自定义Hook时的TypeError问题

问题原因

你遇到的TypeError: (0 , _useStartGame2.default) is not a function错误,本质是Mock的导出方式和自定义Hook实际导出方式不匹配。从错误信息判断,你的组件是通过默认导入引入useStartGame的,但你编写的Mock只提供了命名导出,未正确设置默认导出。

解决方案

根据Hook的实际导出方式,分两种场景处理:

场景1:Hook为默认导出(最常见情况)

如果你的Hook代码末尾是export default useStartGame;,修改Mock代码如下:

jest.mock('@src/hooks/useStartGame', () => ({
  __esModule: true, // 必须添加,标记为ES模块
  default: () => {
    return { startGame: jest.fn() };
  },
}));

关键说明:

  • __esModule: true:告知Jest这是ES模块语法,确保默认导入逻辑能被正确解析。
  • default属性:对应组件中import useStartGame from '@src/hooks/useStartGame'的默认导入规则,保证Mock的Hook能被组件正确识别为函数。

场景2:Hook为命名导出

如果你的Hook采用命名导出(比如export const useStartGame = () => {...}),需确保组件中使用命名导入:

// 组件中的导入语句
import { useStartGame } from '@src/hooks/useStartGame';

此时你原本的Mock写法是正确的,若仍报错,检查是否误将组件中的导入写成了默认导入。

验证方法

可在测试代码开头添加打印,确认Mock后的Hook是否符合预期:

import useStartGame from '@src/hooks/useStartGame';
console.log(useStartGame); // 正常应输出一个函数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:03:36