Как правильно издеваться над i18n для Jest - PullRequest
0 голосов
/ 16 января 2019

У меня есть контейнер в Reaction-native, который импортирует типичные функции, которые мы обычно храним в каталоге utils, например capitaliseWord() или что-то еще.

Одна из функций этого модуля utils использует t, поэтому мы импортируем i18n в эту папку utils, чтобы иметь возможность использовать t

Мы используем languageDetector внутри нашего i18n для определения языка мобильного телефона пользователя. Поскольку languageDetector требуется deviceLocale (например, в Великобритании, США, США и т. Д.), А Jest работает в другом контексте, если я попытаюсь протестировать контейнер, я получу Cannot read property 'deviceLocale' of undefined.

Итак, я создал каталог __mocks__ вручную (как https://jestjs.io/docs/en/manual-mocks#mocking-user-modules состояний) и создал свой собственный i18n, который просто вводит строку deviceLocale вручную, чтобы иметь возможность запускать тесты.

Оказывается, тест игнорирует __mocks__/i18n и указывает прямо на оригинал ... Есть идеи, что может пойти не так?

И мой шутливый конфиг внутри package.json https://gist.github.com/e00dd4ee41b06265632d3bcfe76e7cb0

оригинал i18n.js https://gist.github.com/pavilion/3c48c6017a82356914f0ad69d7251496

издевались i18n.js https://gist.github.com/pavilion/17e322340581fb948ed7e319ae4a5ac9 (обратите внимание, что клавиша detect внутри languageDetector была подвергнута насмешке вручную)

Компонент для тестирования https://gist.github.com/pavilion/20dc0c5b1a6d2ee709b7a71ec7b819c1

utils.js https://gist.github.com/pavilion/1c5df0f71d50462d75234365ae1e4aaf

Comp.test.js https://gist.github.com/pavilion/2a84880bee3a99fa51fc3e28cfa8f913

Ошибка: https://gist.github.com/pavilion/012ee0889ebbe2b93b2108d93543e19c

1 Ответ

0 голосов
/ 16 января 2019

Я думаю, что проблема не в макете, а в импорте! Попробуйте это время, требующее компонента в тесте, после введения макета:

import React from 'react';
import { shallow } from 'enzyme';

jest.mock('../../config/i18n');

describe('<Comp />', () => {
  it('must match the snapshot', () => {
    // Require here instead of importing on top
    const Comp = require("./Comp").default;

    // state and props properly set up
    const wrapper = shallow(<Comp />);
    expect(wrapper).toMatchSnapshot();
  });
});

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

РЕДАКТИРОВАТЬ : перенес мой рабочий пример на github здесь на случай, если это понадобится.

...