【问题标题】:Is it possible to wrap each individual test in a wrapper component?是否可以将每个单独的测试包装在包装器组件中?
【发布时间】:2020-03-19 20:53:09
【问题描述】:

我在我的 React 组件中使用了 Material-UI 组件。因此,我需要在测试中的所有组件周围应用 <MuiThemeProvider></MuiThemeProvider> 组件。

我的组件位于单独的文件夹中:

./src/components/Header/Header.tsx
./src/components/Header/Header.test.ts
./src/components/Header/...
./src/components/Footer/Footer.tsx
./src/components/Footer/Footer.test.ts
./src/components/Footer/...
// etc.

测试必须如下所示:

import React from 'react';
import { render } from '@testing-library/react';
import Header from './Header';

it('matches snapshot', () => {
  const container = render(
    // This theme provider is necessary since my components depend on it.
    // But rather don't want to include this in all my components. 
    <MuiThemeProvider theme={theme}>
      <Header />
    </MuiThemeProvider>
  );
  expect(container).toMatchSnapshot();
});

但现在我必须在每个测试中定义 MuiThemeProvider。

我的所有测试都可以这样做一次吗?

【问题讨论】:

标签: reactjs jestjs react-testing-library


【解决方案1】:

找到它:https://testing-library.com/docs/react-testing-library/setup

原来这是一个反应测试库的东西。

您可以修改渲染函数以在渲染方法中包装一个组件(提供者)。

只需更改渲染函数的导入:

创建包含“包装器”组件的函数:

// test-utils.js
import { render } from '@testing-library/react'
import { ThemeProvider } from 'my-ui-lib'
import { TranslationProvider } from 'my-i18n-lib'
import defaultStrings from 'i18n/en-x-default'

const AllTheProviders = ({ children }) => {
  return (
    <ThemeProvider theme="light"> // here it is
      <TranslationProvider messages={defaultStrings}>
        {children}
      </TranslationProvider>
    </ThemeProvider>
  )
}

const customRender = (ui, options) =>
  render(ui, { wrapper: AllTheProviders, ...options })

// re-export everything
export * from '@testing-library/react'

// override render method
export { customRender as render }

然后像这样开始使用它:

// my-component.test.js
- import { render, fireEvent } from '@testing-library/react';
+ import { render, fireEvent } from '../test-utils';

【讨论】:

    【解决方案2】:

    您可以使用jest.mock 模拟您的高阶组件。

    它可以像下面这样

    jest.mock("hoc-module", () => {
        return {
            hocFunction: function(hocConf) {
                return function(component) {
                    component.defaultProps = {
                        ...component.defaultProps,
                        mockPropKey: mockPropValue
                    };
                    return component;
                };
              }
        };
    });
    

    P.S:上面的代码是我自己写的。

    【讨论】:

    • MuiThemeProvider 会是什么样子?我的组件期望有一个可用的主题对象,从中使用某些值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 2018-09-27
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 2020-09-09
    相关资源
    最近更新 更多