首页 文章

如何在开玩笑中模拟i18next模块

提问于
浏览
2

我正在为现有的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);
  });

});

谢谢 .

1 回答

  • 2

    错误 Cannot read property 'init' of undefined 发生在 i18next.use(Locize) 的结果上而不是 i18next 对象上 . 尝试将模拟更新为:

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

    我用这个文件作为这个模拟的参考:panter/vue-i18next/src/i18n.js

相关问题