Модульный тест i18Next - TypeError: Невозможно прочитать свойство 'init' из неопределенного - PullRequest
0 голосов
/ 27 апреля 2019

Мой код работает нормально, но у меня проблема с настройкой юнит-теста и его тестированием. Я получаю сообщение об ошибке при использовании кода, использующего библиотеку i18next, кто-нибудь может дать какой-нибудь совет?

Ниже приведена конфигурация от здесь

Error

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');        
})

макет 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 голосов
/ 29 апреля 2019

Кто-нибудь может дать совет по этому поводу?Я все еще растерялся!Ошибка исчезла после того, как я изменил эту строку

import i18next from 'i18next';

на

import * as i18next from 'i18next';
0 голосов
/ 28 апреля 2019

Похоже, вы должны насмехаться i18next вот так:

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

Детали

Макет в вопросе настроен для использования i18next следующим образом:

import i18next from 'i18next';

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

Поскольку вы не используете .use, вы можете просто издеваться над .init напрямую.

...