reactjs - 如何在使用 react-testing-library 和 jest 完成的单元测试中启用 react-i18n 翻译文件?

标签 reactjs jestjs internationalization react-testing-library i18next

我正在用 jest 和 react-testing-library 为我的前端应用程序进行单元测试,这是用 React 完成的。在我使用 react-i18next -library 添加国际化之前,我的单元测试运行良好。现在,当我运行测试时,它似乎没有找到/使用翻译文件,所有应该阅读的地方都留空了。我正在使用带有钩子(Hook)的最新 React 版本,而不是 React.Component 我正在使用这种“const-components”:

    const ComponentName = ({t}) => {
        return(
          <p>{t('example')}</p>
        )}
      export default ComponentName;

国际化在实际页面中完美运行,但单元测试由于未使用翻译文件而失败,所以我认为问题在于正确模拟翻译文件。我只是为使用 this.variableName 类型的解决方案的旧 react 找到一些建议解决方案,但这对我没有太大帮助。

我尝试用 jest.fn() 模拟它,但我不确定哪个函数是我应该模拟的函数以及如何从测试中正确使用 useTranslation() 函数。

    import React from 'react';
    import { useTranslation, Trans } from 'react-i18next';
    import { render } from '@testing-library/react';
    import ComponentName from './ComponentName';

    import '../locales/i18n';

    test('renders all documents in the list', () => {
      const mockUseTranslation = jest.fn();

      const { t, i18n } = mockUseTranslation();

      // const t = jest.fn();
      const c = render(<ComponentName t={t} />);
      expect(c.getByText('Translation File Title')).toBeDefined();
      expect(
        c.getAllByText(
          'Lorem ipsum'
        ).length
      ).toBe(3);
    });

错误消息:无法找到包含文本的元素:翻译文件标题。这可能是因为文本被多个元素打断了。在这种情况下,您可以为您的文本匹配器提供一个函数,使您的匹配器更加灵活。

简而言之:应该包含某些文本的地方现在完全是空的。

最佳答案

例如,您不应该模拟翻译,而是将带有翻译库的组件呈现为高阶组件;

import React from 'react';
import i18n from '../../../i18n' // your i18n config file
import { render } from '@testing-library/react';
import ComponentName from './ComponentName';
import { I18nextProvider } from 'react-i18next'

test('renders all documents in the list', () => {
    const c = render(
      <I18nextProvider i18n={i18n}> // actually give translation to your component
         <ComponentName />
      </I18nextProvider>
    );
    // example if you have a key called example
    expect(c.getByText(i18n.getDataByLanguage('en').translation.example)).toBeDefined(); 
});

除了使用 i18n.getDataByLanguage('en') 调用您的翻译文本,您可以提供项目的默认翻译,如果它是法语,则通过 i18n.getDataByLanguage('fr') 调用它。

也像这样更改您的组件,而不是从 props 中获取 useTranslation 钩子(Hook),而是将其带入带有钩子(Hook)的组件中

ComponentName.jsx

import { useTranslation } from 'react-i18next'

const ComponentName = () => {
  const { t } = useTranslation()

  return(
    <p>{t('example')}</p>
  )}

export default ComponentName;

关于reactjs - 如何在使用 react-testing-library 和 jest 完成的单元测试中启用 react-i18n 翻译文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57148082/

相关文章:

javascript - React 组件中的三元条件 className

javascript - 如何在 React 构建中禁用 Uglify

reactjs - 使用 react-testing-library 时让 react-datepicker 正确显示

css - 将全局 css 文件与 CSS 模块一起使用

javascript - 如何制作一个可以编辑和保存的函数

ios - 快速将本地化字符串添加到 UITextView

gwt - 如何国际化本地化 GWT TabLayoutPanel 中选项卡的标题

jsf - 以编程方式访问 JSF 应用程序中的属性文件

node.js - Jest 的 expect(value).toBeInstanceOf(Class) 因 expect(util.promisify(...)()).toBeInstanceOf(Promise) 等而失败

javascript - 如何使用 Jest/Puppeteer 等待元素从 DOM 中移除