Тестирование объекта Date с помощью Jest с использованием Typescript и i18next - PullRequest
0 голосов
/ 19 января 2020

включает библиотеку локализации, и у меня есть объект даты в моем компоненте, который выглядит следующим образом:

  getDate = () => {
    const { t } = this.props;
    return new Date().toLocaleString(t('locale.name'), {
      weekday: "long",
      month: "long",
      day: "numeric",
    });
  };

Когда я пытаюсь запустить тест, я получаю ошибку:

RangeError: Invalid language tag: language.name at Date.toLocaleString ()

  15 |   getDate = () => {
  16 |     const { t } = this.props;
> 17 |     return new Date().toLocaleString(t('language.name'), {
     |                       ^
  18 |       weekday: "long",
  19 |       month: "long",
  20 |       day: "numeric",

Таким образом, он не распознает локаль i18n. Связано ли это с тем, как я издеваюсь над i18n?

Моя текущая настройка:

Reaction-i18next.ts:

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

Мой jest.config:

module.exports = {
  verbose: true,
  roots: ["<rootDir>"],
  testRegex: "/__tests__/.*\\.(test|spec)\\.tsx?",
  transform: {
    "^.+\\.tsx?$": "ts-jest",
  },
  moduleNameMapper: {
    "react-i18next": "<rootDir>/__tests__/__mock__/react-i18next.ts"
  },
};

i18n.ts

import i18n from "i18next";
import {initReactI18next} from "react-i18next";
import english from "./locales/en/common.json";
import french from "./locales/fr/common.json";

i18n.use(initReactI18next).init({
  lng: 'en',
  resources: {
    fr: {
      translation: french,
    },
    en: {
      translation: english,
    },
  },
  interpolation: {
    escapeValue: false,
  },
  fallbackLng: ["en"]
});

export default i18n;

1 Ответ

0 голосов
/ 19 января 2020

Вы издеваетесь над тем, что он возвращает ключ сам, поэтому toLocaleString получает language.name в качестве языка и выбрасывает "Недопустимый языковой тег".

My Подход с локализацией формата даты использует метод formatting для форматирования дат по локали.

// i18next.config.js

...
{
  interpolation: {
    format: (value, format, lng) => {
      if (value instanceof Date) {
        const cloneDate = new Date(value);

        return cloneDate.toLocaleString(lng, mapFormatToLocale[format]);
      }
      return value;
    };
  }
}
...

const mapFormatToLocale = {
  YYYYmmdd: {
    weekday: 'long',
    month: 'long',
    day: 'numeric',
  },
};
// locale.en.json 

{
  "MY_DATE": "My Date {{date, YYYYmmdd}}"
}

// usage of the date locatization

t('MY_DATE', {date: new Date()});

Крутой частью этого метода является то, что вы определяете стиль формата даты внутри вашего перевода json файлов, это означает, что вы можете изменить его для каждого языка, если это необходимо.

Этот метод инвертирует глубину между локалью и датами и будет работать с вашим издевательством, потому что ваше издевательство просто вернет ключ перевода.

...