单元测试i18Next-TypeError:无法读取未定义的属性'init'

时间:2019-04-27 07:36:47

标签: reactjs typescript unit-testing jestjs i18next

我的代码工作正常,但是在设置单元测试和测试时遇到了问题。使用i18next库编写代码时出现错误,有人可以提出建议吗?

下面的配置来自here

错误

  

TypeError:无法读取未定义的属性'init'

   7 |  i18next
>  8 |   .init({
     |    ^
   9 |     interpolation: {
  10 |       escapeValue: false,
  11 |     },

Helper.tsx

export function validation(controlName: string){   
    var messages = require('src/translations/i18next');
    var requireMessage=messages.t('required');
    //omit irelevant code
  }

Helper.test.tsx

test('Validation',()=>{
    expect(Helper.validation('My Name')).toBe('aaaaa');        
})

mock-setup.js

jest.mock('i18next', () => ({
    use: () => {
      return {
        init: () => { }
      };
    },
    t: k => k
  }));

jest.config.js

module.exports = {
    verbose: true,
    'roots': [
      '<rootDir>/src'
    ],
    'transform': {            
      "^.+\\.(js)$": "<rootDir>/node_modules/babel-jest",
      "^.+\\.tsx?$": "ts-jest"
    },
    'testRegex': '(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$',    
    'moduleFileExtensions': [
      'ts',
      'tsx',
      'js',
      'jsx',
      'json',
      'node'
    ],
    'moduleNameMapper': {
      '^src/(.*)': '<rootDir>/src/$1',
      '^components/(.*)': '<rootDir>/src/components/$1'
    },
    'snapshotSerializers': ['enzyme-to-json/serializer'],

    'setupFiles': ['<rootDir>/src/jest/setupEnzyme.ts',
    '<rootDir>/src/jest/mock-setup.js', 
  ],
     'moduleDirectories': ['node_modules', 'src']
  }

i18next.tsx

import i18next from 'i18next';

var common_en = require( "src/translations/en/common.json");
var common_es = require( "src/translations/es/common.json");

i18next
  .init({
    interpolation: {
      escapeValue: false,
    },
    lng: 'en', // 'en' | 'es'
    resources: {
      en: {translation: common_en},
      es: {translation: common_es},
    },
    debug: true,
  })

  export default i18next;

tsconfig.json

{
    "compilerOptions": {
        "lib": [ "es2015","dom" ],
      "target": "es5",
      "module": "commonjs",
      "esModuleInterop": true,
      "jsx": "react",   
      "sourceMap":  true, 
      "baseUrl": ".",
      "allowSyntheticDefaultImports": true,
        "paths": {
            "src/*": ["src/*"],
            "components/*": ["src/components/*"]            
        }
    } 
}

2 个答案:

答案 0 :(得分:0)

看起来您应该像这样嘲笑i18next

jest.mock('i18next', () => ({
  init: () => {},
  t: k => k
}));

详细信息

问题中的模拟程序设置为使用i18next,如下所示:

import i18next from 'i18next';

i18next
  .use(...)
  .init(...);

由于您没有使用.use,因此可以直接模拟.init

答案 1 :(得分:0)

任何人都可以对此提出建议吗?我还是很困惑!我更改此行后,错误消失了

import i18next from 'i18next';

import * as i18next from 'i18next';