是否可以将每个单独的测试包装在包装器组件中?
Is it possible to wrap each individual test in a wrapper component?
我在我的 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。
是否可以对我的所有测试执行一次?
您可以使用 jest.mock
模拟您的高阶组件。
可以像下面这样
jest.mock("hoc-module", () => {
return {
hocFunction: function(hocConf) {
return function(component) {
component.defaultProps = {
...component.defaultProps,
mockPropKey: mockPropValue
};
return component;
};
}
};
});
P.S: 上面的代码是我临时写的
找到了:https://testing-library.com/docs/react-testing-library/setup
原来这是一个反应测试库的东西。
您可以修改渲染函数以在渲染方法中包装一个组件(提供者)。
只需更改渲染函数的导入:
创建包含 'wrapper' 组件的函数:
// 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';
我在我的 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。
是否可以对我的所有测试执行一次?
您可以使用 jest.mock
模拟您的高阶组件。
可以像下面这样
jest.mock("hoc-module", () => {
return {
hocFunction: function(hocConf) {
return function(component) {
component.defaultProps = {
...component.defaultProps,
mockPropKey: mockPropValue
};
return component;
};
}
};
});
P.S: 上面的代码是我临时写的
找到了:https://testing-library.com/docs/react-testing-library/setup
原来这是一个反应测试库的东西。
您可以修改渲染函数以在渲染方法中包装一个组件(提供者)。
只需更改渲染函数的导入:
创建包含 'wrapper' 组件的函数:
// 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';