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

使用Jest+TypeScript测试含i18next的日期对象时遇语言标签错误

问题根源&解决方案

我一眼就看出问题出在哪儿了:你Jest里mock的i18next的t函数只是直接返回传入的key,导致调用t('locale.name')时,返回的是字符串'locale.name',而Date.toLocaleString()要求第一个参数必须是合法的语言标签(比如'en'、'fr'这类标准值),'locale.name'显然不符合要求,所以才抛出了RangeError。

修复步骤

修改你__tests__/__mock__/react-i18next.ts里的mock逻辑,让t函数针对'locale.name'返回合法的语言标签,同时保留其他key的原有mock行为:

jest.mock('i18next', () => ({
  use: () => {
    return { init: () => {} };
  },
  t: (key: string) => {
    // 针对locale.name返回合法语言标签,比如'en'或者'fr'
    if (key === 'locale.name') {
      return 'en';
    }
    // 其他key依然返回原key,不影响现有测试逻辑
    return key;
  }
}));

进阶优化(可选)

如果你的测试里需要mock多个i18n key,可以用映射对象来管理,更清晰:

jest.mock('i18next', () => ({
  use: () => {
    return { init: () => {} };
  },
  t: (key: string) => {
    const mockTranslations = {
      'locale.name': 'en',
      'button.submit': 'Submit',
      'message.error': 'Something went wrong'
    };
    // 有映射值就返回对应内容,没有则返回原key
    return mockTranslations[key] || key;
  }
}));

额外建议

如果你的组件高度依赖i18n的真实语言环境,更严谨的做法是直接在测试里导入项目本身的i18n.ts配置,而不是mock整个库:

import '../i18n'; // 导入项目真实的i18n初始化文件
import YourComponent from '../YourComponent';

// 接下来编写你的测试用例

这样能让测试环境更贴近真实运行场景,避免mock带来的不匹配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:02:39