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

为何Jest测试自定义React Hook时无法正常提供useTranslation Hook?

问题根因与解决方案

你当前的模拟逻辑存在设计问题:你写的t函数实现逻辑就是直接返回入参的本地化key,自然不会返回翻译后的文本。

方案1:轻量Mock(适用于仅校验业务逻辑的场景)

如果你的测试只需要验证自定义Hook的解析逻辑正确,不需要校验翻译内容的准确性,只需在Mock中添加你需要用到的翻译映射表即可:

jest.mock('react-i18next', () => ({
  useTranslation: () => {
    // 测试用到的所有翻译key和对应译文的映射
    const mockTransMap = {
      'user.name': '用户名',
      'user.age': '年龄',
      // 按需补充其他key
    }
    return {
      t: jest.fn((key) => mockTransMap[key] ?? key),
      // 如果你用到了i18n实例的其他属性,也可以在这里补充Mock
      i18n: {
        changeLanguage: jest.fn(),
        language: 'zh-CN'
      }
    }
  },
}))

该方案测试运行速度快,还可以通过t的Mock调用记录,验证你是否正确传入了本地化key。

方案2:使用真实i18n实例(适用于需要校验翻译内容的场景)

如果你需要验证翻译内容是否正确匹配了翻译文件,不要Mock整个react-i18next包,在测试初始化文件中配置真实的i18n实例即可:

import i18n from 'i18next'
import { initReactI18next } from 'react-i18next'
// 引入你的翻译资源文件
import zhTranslation from './locales/zh-CN.json'

i18n.use(initReactI18next).init({
  lng: 'zh-CN',
  fallbackLng: 'zh-CN',
  resources: {
    'zh-CN': {
      translation: zhTranslation
    }
  },
  interpolation: {
    escapeValue: false
  }
})

注意使用该方案时需要删除之前写的jest.mock('react-i18next')代码,避免Mock覆盖真实的模块导出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:18:00