我在测试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';
答案 0 :(得分:0)
我相信我已经克服了这个问题。
将模拟中的第35行替换为:
var selectedLanguage = "en-gb";
useMock.i18n = {
language: selectedLanguage,
changeLanguage: (lng) => selectedLanguage = lng,
};