Как издеваться над i18n.addResourceBundle? - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть некоторые проблемы с тестированием i18next, мы используем jest + энзим в реактивном проекте + redux.

Мы реализовали react-i18next примерно так в lib/i18n файле:

import i18n from 'i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
import { reactI18nextModule } from 'react-i18next';
import moment from 'moment';
import 'moment/locale/nl';

i18n
  .on('languageChanged', (lng) => {
    moment.locale(lng);
  })
  .use(LanguageDetector)
  .use(reactI18nextModule)
  .init({
    fallbackLng: 'en',
    debug: true,

    react: {
      wait: true,
    },
  });

export default i18n;

мы создали папку __mocks__ и использовали предоставленный пример в (https://github.com/i18next/react-i18next) __mocks__/react-18next.js, мы видим, что, как только мы импортируем i18n и пытаемся манипулировать его свойствами из файла не-jsxэтот макет не вызывается. Наш вариант использования следующий:

У нас есть действие, которое запрашивает все переводы и использует i18n.addResourceBundle в ответе для установки всех переводов.

inВ этом действии мы импортируем файл ../lib/i18n.js, созданный для эффекта, но как только мы начинаем тестировать наше действие, мы продолжаем получать следующие ошибки

TypeError: _i18next.default.on is not a function

       6 |
       7 | i18n
    >  8 |   .on('languageChanged', (lng) => {
         |    ^
       9 |     moment.locale(lng);
      10 |   })
      11 |   .use(LanguageDetector)

      at Object.on (src/lib/i18n.js:8:4)
      at Object.<anonymous> (src/actions/translation.js:2:1)
      at Object.<anonymous> (src/actions/translation.test.js:2:1)

, мы обнаружили, что __mocks__/react-i18next.js не вызывается,но если мы создадим файл __mocks__/i18next.js, он будет имитировать импортированный экземпляр i18n, что имеет смысл, поскольку в файле конфигурации lib/i18n.js мы импортируем его import i18n from 'i18next';, но еще раз предоставленный файл макета в вашем проекте непохоже на работу.

Мы рассматриваем следующие сценарии и хотели бы спросить мнение: - перенести наше действие извлечения в i18next-xhr-backend, и мы хотели бы спросить вас, решит ли это проблему?так как мы больше не собираемся импортировать файл конфигурации и, следовательно, не нужно его высмеивать, но мы утратили бы нашу функциональность ведения журнала действий с избыточностью, так как мы используем хранилище с избыточностью для отслеживания действий пользователя.- правильно смоделируйте файл, чтобы сохранить текущие функциональные возможности, и для этого мы хотели бы спросить, не сталкивался ли кто-либо с таким же поведением.

Происходит в response-i18следующая версия "react-i18next": "^9.0.2",

1 Ответ

0 голосов
/ 03 июня 2019

Мне удалось преодолеть эту проблему, я считаю.

Заменить строку 35 в макете на:

var selectedLanguage = "en-gb";
useMock.i18n = {
    language: selectedLanguage,
    changeLanguage: (lng) => selectedLanguage = lng,
};
...