如何模拟i18n.addResourceBundle?

时间:2019-02-18 11:34:26

标签: reactjs i18next react-i18next

我在测试i18next时遇到一些问题,我们在反应项目+还原中使用了开玩笑+酶。

我们在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来设置所有翻译。

在此操作中,我们导入为此效果创建的../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实例,因为在配置文件{{1 }}我们正在导入它lib/i18n.js,但是您项目中提供的模拟文件再次似乎无法正常工作。

我们正在考虑以下情况,并希望提出意见: -将获取操作迁移到i18next-xhr-backend,我们想问您这是否可以解决问题?因为我们不再要导入配置文件,因此不需要模拟它,但是由于我们使用redux存储来跟踪用户操作,因此我们将失去redux操作日志功能。 -正确模拟文件以维护当前功能,为此,我们想询问是否有人已经遇到相同的行为。

出现在react-i18next版本中 import i18n from 'i18next';

1 个答案:

答案 0 :(得分:0)

我相信我已经克服了这个问题。

将模拟中的第35行替换为:

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