как издеваться над модулем i18next в шутку

Я настраиваю тестовую среду для существующего проекта Vue и решил пошутить с помощью vue-test-utils.

Все установлено и на месте, однако, когда я импортирую компонент, я хочу протестировать его в файле .test.js и добавить компонент в тестовые утилиты следующим образом:

let wrapper = shallow(Home)

набор тестов вылетает с ошибкой: TypeError: Cannot read property 'i18next' of undefined.

Я решил издеваться над модулем i18next, но у меня проблемы с издевательством. Мой макет выглядел так:

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

но я всегда получаю ошибку:

TypeError: Cannot read property 'init' of undefined

      35 |
      36 | i18next
    > 37 |      .use(Locize)
      38 |      .init(i18nextOptions);
      39 |
      40 | export default new VueI18Next(i18next);

Можете как-то объяснить, как правильно издеваться над модулем i18next, чтобы мой объект-оболочка мог инициализироваться? Также, если я делаю что-то еще не так, укажите мне правильное направление. Ниже приведен полный тестовый пример:

import { shallow, mount, createLocalVue } from '@vue/test-utils';
import Home from '../../src/app/pages/home/index/index.vue';

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

describe('Home Component', () => {

  let wrapper;

  beforeEach(() => {
    wrapper = shallow(Home);
  });

  it('something', () => {
    console.log('bleh');
    expect(wrapper.contains('div')).toBe(true);
  });

});

Спасибо.


person Perp    schedule 14.02.2018    source источник


Ответы (1)


Ошибка Cannot read property 'init' of undefined возникает в результате i18next.use(Locize), а не в объекте i18next. Попробуйте обновить свой макет до:

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

Я использовал этот файл как ссылку на этот макет: i18next / src / i18n.js

person daniloisr    schedule 14.02.2018
comment
jest.mock('i18next', () => ({ use: () => { return { init: () => { } }; }, t: k => k })); Это сработало частично, чтобы получить другое сообщение об ошибке: TypeError: this.i18next.on is not a function 38 | .init(i18nextOptions); 39 | > 40 | export default new VueI18Next(i18next); 41 | - person Perp; 14.02.2018
comment
Даже если я добавлю функции и t внутри init, останется та же ошибка, что и в моем комментарии выше. - person Perp; 15.02.2018
comment
Попробуйте передать свою конфигурацию i18n методу shallow, это должно быть примерно так: shallw(Home, i18n), я дал аналогичный ответ на этот вопрос: stackoverflow. com / a / 48792562/1042324 - person daniloisr; 15.02.2018
comment
Ну ... я не уверен. Когда я добавляю его в shallow / mount, в моей настройке karma + jasmine он ничего не делает и по-прежнему говорит, что i18next не определен. Однако в Jest он не жалуется на i18next, но выдает кучу ReferenceError: sessionStorage не определен, ошибки. Итак, даже базовое утверждение вроде: expect (2 + 2) .toBe (4); не работает... - person Perp; 16.02.2018