首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何修复` `TypeError:使用Jest测试i18next时无法读取未定义`的属性'type‘

如何修复` `TypeError:使用Jest测试i18next时无法读取未定义`的属性'type‘
EN

Stack Overflow用户
提问于 2019-04-04 12:06:38
回答 5查看 8.7K关注 0票数 4

我有一个react项目,并且包含了i18next = 15.0.4和react-i18next = 10.2.0依赖项。我已经创建了一个使用react-i18next初始化i18next的模块,我正在尝试使用Jest对这段代码进行单元测试。

我尝试导入初始化i18next的i18n模块,并使用jest对其进行单元测试。

下面是我的i18n.ts模块

代码语言:javascript
代码运行次数:0
运行
复制
import i18next from "i18next";
import { initReactI18next } from "react-i18next";

const config = {
    resources: {
        en: {
            static: {},
        },
    },
    fallbackLng: "en",
    defaultNS: "static",
    ns: "static",
    interpolation: {
        prefix: "[",
        suffix: "]",
    },
};

i18next.use(initReactI18next).init(config);

export default i18next;

我试着从我的测试代码中调用它,就像这样(i18n.test.ts):

代码语言:javascript
代码运行次数:0
运行
复制
import i18n from "./i18n";

describe("i18n", () => {

    it("should work fine", () => {
        const strings = {
            key: "value",
        };
        i18n.addResourceBundle("en", "static", strings, true, true);
    });
});

我希望这个测试能够通过,但我得到的却是以下错误:

代码语言:javascript
代码运行次数:0
运行
复制
TypeError: Cannot read property 'type' of undefined
      at I18n.use (node_modules/i18next/dist/commonjs/i18next.js:257:18)

这基本上指向了i18next.js中的以下代码

代码语言:javascript
代码运行次数:0
运行
复制
    value: function use(module) {
      if (module.type === 'backend') {
        this.modules.backend = module;
      }

如何解决此问题?

EN

回答 5

Stack Overflow用户

发布于 2019-06-24 16:59:55

试试这个:

const reactI18nextModule = require("react-i18next");

而不是

import { initReactI18next } from "react-i18next";

在这里阅读更多关于jest测试的require import的信息:

Jest mocking default exports - require vs import

希望它能有所帮助:)

票数 6
EN

Stack Overflow用户

发布于 2019-12-23 05:24:42

您很可能遵循了以下指南:https://react.i18next.com/misc/testing

它说你应该使用这个mock:

代码语言:javascript
代码运行次数:0
运行
复制
jest.mock('react-i18next', () => ({
  // this mock makes sure any components using the translate HoC receive the t function as a prop
  withTranslation: () => Component => {
    Component.defaultProps = { ...Component.defaultProps, t: () => "" };
    return Component;
  },
}));

但是当你这样做的时候,这里没有你想要使用的initReactI18next

代码语言:javascript
代码运行次数:0
运行
复制
import { initReactI18next } from "react-i18next";
i18next.use(initReactI18next).init(config);

文档会破坏你:(

您需要的是删除存根或在存根模块中提供initReactI18next密钥。

我已经在这里通知了作者:https://github.com/i18next/react-i18next-gitbook/pull/42

票数 3
EN

Stack Overflow用户

发布于 2019-06-25 21:10:02

也许你从<=V9更新到了>=V10。因为>=V10中不再提供reactI18nextModule。请尝试使用initReactI18next

有关更多详细信息,请访问https://react.i18next.com/latest/migrating-v9-to-v10

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55507684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档