Как исправить `TypeError: не удается прочитать свойство 'type' of undefined` при тестировании i18next с помощью Jest

У меня есть проект реакции, и я включил зависимости i18next = 15.0.4 и react-i18next = 10.2.0. Я создал модуль для инициализации i18next с помощью response-i18next, и я пытаюсь выполнить модульное тестирование этого кода с помощью Jest.

Я попытался импортировать свой модуль i18n, который инициализирует i18next, и протестировать его с помощью jest.

Вот мой модуль для i18n.ts

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):

import i18n from "./i18n";

describe("i18n", () => {

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

Я ожидал, что этот тест пройдет успешно, но вместо этого я получаю следующую ошибку:

TypeError: Cannot read property 'type' of undefined
      at I18n.use (node_modules/i18next/dist/commonjs/i18next.js:257:18)

Что в основном указывает на этот код в i18next.js

    value: function use(module) {
      if (module.type === 'backend') {
        this.modules.backend = module;
      }

Как я могу исправить эту проблему?


person Jesus    schedule 04.04.2019    source источник


Ответы (5)


Попробуй это:

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

вместо того

import { initReactI18next } from "react-i18next";

подробнее о require vs import для шутливого тестирования читайте здесь:

Экспорт в шутку по умолчанию - требуется vs импорт

Надеюсь, это поможет :)

person khpa    schedule 24.06.2019
comment
как я могу экспортировать useTranslation с помощью require? - person Shafaq Kazmi; 24.03.2020
comment
Я не понимаю вопроса? :) вы спрашиваете про экспорт модуля es5? module.exports = foo; - person khpa; 25.03.2020

Скорее всего, вы следовали этому руководству: https://react.i18next.com/misc/testing

В нем говорится, что вам следует использовать этот макет:

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, которые вы пытаетесь использовать здесь:

import { initReactI18next } from "react-i18next";
i18next.use(initReactI18next).init(config);

Документация саботирует вас :(

Вам нужно либо удалить заглушки, либо предоставить ключ initReactI18next в модуле заглушки.

Я уведомил авторов здесь: https://github.com/i18next/react-i18next-gitbook/pull/42

person Vanuan    schedule 22.12.2019

Неисправная функция:

function use(module) {
      if (module.type === 'backend') { // cannot read `type` of `undefined`

Вывод: module это undefined. Это исходит от:

i18next.use(initReactI18next)

Вывод: initReactI18next не определено. Это исходит от:

import { initReactI18next } from "react-i18next";

Вывод: initReactI18next - это не то, что экспортировано из react-i18next

person basarat    schedule 04.04.2019
comment
initReactI18next экспортируется из response-i18next - person Javid Noutash; 19.02.2021

Надо издеваться над initReactI18next. Попробуйте следующее:

jest.mock('react-i18next', () => {
  const useMock = [k => k, {}];
  useMock.t = k => k;

  return {
    useTranslation: () => useMock,
    initReactI18next: () => {}
  };
});
person t-reksio    schedule 09.04.2020

Возможно, вы сделали обновление с ‹= _ 1_ на› = _ 2_. Потому что reactI18nextModule больше не доступен в ›= _ 4_. Попробуйте вместо этого использовать initReactI18next.

Дополнительные сведения см. На странице https://react.i18next.com/latest/migrating-v9-to-v10

person Kevin    schedule 25.06.2019