React native 如何测试使用react-i18next的react本机组件?

React native 如何测试使用react-i18next的react本机组件?,react-native,jestjs,react-i18next,React Native,Jestjs,React I18next,我正在尝试使用jest开始测试一个已建立的RN应用程序。大多数组件都用react-i18next提供的名称空间包装在中 运行测试时,出现以下错误: FAIL tests/setting.test.js ● Test suite failed to run TypeError: Cannot read property 'type' of undefined 4 | 5 | i18n > 6 | .use(initReactI18ne

我正在尝试使用jest开始测试一个已建立的RN应用程序。大多数组件都用react-i18next提供的名称空间包装在

运行测试时,出现以下错误:

 FAIL  tests/setting.test.js
  ● Test suite failed to run

    TypeError: Cannot read property 'type' of undefined

      4 | 
      5 | i18n
    > 6 |   .use(initReactI18next)
        | ^
      7 |   .init({
      8 |     fallbackLng: 'en',
      9 |     resources: {

      at I18n.use (node_modules/i18next/dist/commonjs/i18next.js:260:16)
      at Object.<anonymous> (config/i18nForTest.js:6:1)
      at Object.<anonymous> (tests/setting.test.js:5:43)
然后写了一些测试:

import 'react-native';
import React from 'react';
import renderer from 'react-test-renderer';
import {I18nextProvider} from 'react-i18next';
import i18n from 'config/i18nForTest';
import Settings from 'containers/Settings';

it('Does Settings renders correctly?', () => {
  const tree = renderer
    .create(
      <I18nextProvider i18n={i18n}>
        <Settings t= {key => key} />
      </I18nextProvider>,
    )
    .toJSON();
  expect(tree).toMatchSnapshot();
});
导入“react native”;
从“React”导入React;
从“反应测试渲染器”导入渲染器;
从'react-I18nextProvider'导入{I18nextProvider};
从'config/i18nForTest'导入i18n;
从“容器/设置”导入设置;
它('设置是否正确呈现?',()=>{
常量树=渲染器
.创造(
密钥}/>
,
)
.toJSON();
expect(tree.toMatchSnapshot();
});
您可以在package.json中找到我的jest配置:



"jest": {
    "setupFiles": ["<rootDir>/jest.setup.js"],
    "preset": "react-native",
    "testMatch": [
      "<rootDir>/tests/**/*.test.js?(x)",
      "<rootDir>/src/**/*.test.js"
    ],
    "transformIgnorePatterns": ["node_modules/(?!(@react-native-community|react-navigation|react-native))"
    ],
    "transform": {
      "^.+\\.(js)$": "<rootDir>/node_modules/react-native/jest/preprocessor.js"
    }
  },


“笑话”:{
“setupFiles”:[“/jest.setup.js”],
“预设”:“反应本机”,
“测试匹配”:[
“/tests/***.test.js?(x)”,
“/src/***.test.js”
],
“transformIgnorePatterns”:[“节点_模块/(?!(@react-native社区| react-navigation | react-native))”
],
“转变”:{
“^.+\.(js)$”:“/node\u modules/react native/jest/preprocessor.js”
}
},

谢谢

我终于找到了解决问题的办法。 我认为文档中提供的测试示例是针对v10的,我使用的是v9。 因此,我修改了i18n配置测试以使用
reactI18nextModule
,因此现在是这样的:

import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import { reactI18nextModule } from 'react-i18next';


 i18n
  .use(reactI18nextModule)
  .init({
    fallbackLng: 'en',
    resources: {
      en: {},
      fr: {}
    },
    // have a common namespace used around the full app
    ns: ['translations'],
    defaultNS: 'translations',

    debug: true,

    interpolation: {
      escapeValue: false, // not needed for react!!
    },
  });

export default i18n;
之后,我可以在测试组件中省略i18nProvider,如下所示:

import 'react-native';
import React from 'react';
import renderer from 'react-test-renderer';
import {I18nextProvider} from 'react-i18next';
import i18n from 'config/i18nForTest';
import {Settings} from 'containers/Settings'; // to get redux connected component import Setting without {}


it('Does Settings renders correctly?', () => {
  const tree = renderer
    .create(
        <Settings t={key => key} />
         )
    .toJSON();
  expect(tree).toMatchSnapshot();
});


导入“react native”;
从“React”导入React;
从“反应测试渲染器”导入渲染器;
从'react-I18nextProvider'导入{I18nextProvider};
从'config/i18nForTest'导入i18n;
从“容器/设置”导入{Settings};//在不使用{}的情况下获取redux连接的组件导入设置
它('设置是否正确呈现?',()=>{
常量树=渲染器
.创造(
密钥}/>
)
.toJSON();
expect(tree.toMatchSnapshot();
});
import 'react-native';
import React from 'react';
import renderer from 'react-test-renderer';
import {I18nextProvider} from 'react-i18next';
import i18n from 'config/i18nForTest';
import {Settings} from 'containers/Settings'; // to get redux connected component import Setting without {}


it('Does Settings renders correctly?', () => {
  const tree = renderer
    .create(
        <Settings t={key => key} />
         )
    .toJSON();
  expect(tree).toMatchSnapshot();
});