使用 Jest 对 Chakra UI 进行单元测试
Unit testing Chakra UI with Jest
目前我正在尝试对我的应用程序进行单元测试,该应用程序是使用 Create-React-App 和打字稿构建的,并且它是用 chakraui 设计的。 Chakrui 包含一个组件 ThemeProvider,它必须如此包装整个应用程序。
这是我的 index.tsx 文件
import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import * as serviceWorker from "./serviceWorker";
import { ThemeProvider, CSSReset } from "@chakra-ui/core/dist";
import { theme } from "@chakra-ui/core/dist";
ReactDOM.render(
<React.StrictMode>
<ThemeProvider theme={theme}>
<CSSReset />
<App />
</ThemeProvider>
</React.StrictMode>,
document.getElementById("root")
对于我编写的每个单元测试,我都必须使用 ThemeProvider 包装组件才能通过测试:
import React from "react";
import { render } from "@testing-library/react";
import { ThemeProvider } from "@chakra-ui/core/dist";
import App from "./App";
describe("<App />", () => {
test("smoke test", () => {
render(
<ThemeProvider>
<App />
</ThemeProvider>
);
});
});
但这非常冗长,必须对我编写的每个 测试进行。有没有办法在每个 .test.tsx
文件中只执行一次?
您可以创建自己的主题包装函数
import React from "react";
import { ThemeProvider } from "@chakra-ui/core/dist";
export const ThemeWrapper = ({ children }) => (
<ThemeProvider>{children}</ThemeProvider>
);
然后在测试中指定wrapper
import React from "react";
import { render } from "@testing-library/react";
import { ThemeWrapper } from "../testUtils";
import App from "./App";
describe("<App />", () => {
test("smoke test", () => {
render(<App />, { wrapper: ThemeWrapper });
});
});
这略微减少了测试代码。您也许还可以创建自定义渲染函数(按照 redux 的步骤)。
它可能看起来像
import React from "react";
import { render } from "@testing-library/react";
import { ThemeProvider } from "@chakra-ui/core/dist";
export const renderWithTheme = ui => {
const Wrapper = ({ children }) => (
<ThemeProvider>{children}</ThemeProvider>
);
return render(ui, { wrapper: Wrapper });
};
与上面的包装器基本相同,但更多地集成到测试渲染功能中。如果您需要传入主题对象或其他渲染选项,您也可以稍微调整函数签名,这只是一个简单的例子。
现在测试看起来像
import React from "react";
import { renderWithTheme } from "../testUtils";
import App from "./App";
describe("<App />", () => {
test("smoke test", () => {
renderWithTheme(<App />);
});
Jest 可能 模拟你从 @chakra-ui/core/dist
导入的 (取决于你的 jest configuration),这可能导致你导入 chakra-ui 个组件未定义。
导入 Theme Provider 并每次 将其与渲染一起包装可能是一种方法。当您的 index.tsx
中有 多个组件 时,可能会出现此问题。因此,您可能不想导入每个组件。
在这种情况下,您需要从 @chakra-ui/core.
导入 actual 组件
在 Jest 中这样做的最佳方式(据我所知)是:
jest.mock("@chakra-ui/core", () => {
const ui = jest.requireActual("@chakra-ui/core");
return {
...ui,
customKey: 'customValue',
};
})
这样您甚至可以将 自定义函数和 key-values 添加到导入的模块中。
目前我正在尝试对我的应用程序进行单元测试,该应用程序是使用 Create-React-App 和打字稿构建的,并且它是用 chakraui 设计的。 Chakrui 包含一个组件 ThemeProvider,它必须如此包装整个应用程序。
这是我的 index.tsx 文件
import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import * as serviceWorker from "./serviceWorker";
import { ThemeProvider, CSSReset } from "@chakra-ui/core/dist";
import { theme } from "@chakra-ui/core/dist";
ReactDOM.render(
<React.StrictMode>
<ThemeProvider theme={theme}>
<CSSReset />
<App />
</ThemeProvider>
</React.StrictMode>,
document.getElementById("root")
对于我编写的每个单元测试,我都必须使用 ThemeProvider 包装组件才能通过测试:
import React from "react";
import { render } from "@testing-library/react";
import { ThemeProvider } from "@chakra-ui/core/dist";
import App from "./App";
describe("<App />", () => {
test("smoke test", () => {
render(
<ThemeProvider>
<App />
</ThemeProvider>
);
});
});
但这非常冗长,必须对我编写的每个 测试进行。有没有办法在每个 .test.tsx
文件中只执行一次?
您可以创建自己的主题包装函数
import React from "react";
import { ThemeProvider } from "@chakra-ui/core/dist";
export const ThemeWrapper = ({ children }) => (
<ThemeProvider>{children}</ThemeProvider>
);
然后在测试中指定wrapper
import React from "react";
import { render } from "@testing-library/react";
import { ThemeWrapper } from "../testUtils";
import App from "./App";
describe("<App />", () => {
test("smoke test", () => {
render(<App />, { wrapper: ThemeWrapper });
});
});
这略微减少了测试代码。您也许还可以创建自定义渲染函数(按照 redux 的步骤)。
它可能看起来像
import React from "react";
import { render } from "@testing-library/react";
import { ThemeProvider } from "@chakra-ui/core/dist";
export const renderWithTheme = ui => {
const Wrapper = ({ children }) => (
<ThemeProvider>{children}</ThemeProvider>
);
return render(ui, { wrapper: Wrapper });
};
与上面的包装器基本相同,但更多地集成到测试渲染功能中。如果您需要传入主题对象或其他渲染选项,您也可以稍微调整函数签名,这只是一个简单的例子。
现在测试看起来像
import React from "react";
import { renderWithTheme } from "../testUtils";
import App from "./App";
describe("<App />", () => {
test("smoke test", () => {
renderWithTheme(<App />);
});
Jest 可能 模拟你从 @chakra-ui/core/dist
导入的 (取决于你的 jest configuration),这可能导致你导入 chakra-ui 个组件未定义。
导入 Theme Provider 并每次 将其与渲染一起包装可能是一种方法。当您的 index.tsx
中有 多个组件 时,可能会出现此问题。因此,您可能不想导入每个组件。
在这种情况下,您需要从 @chakra-ui/core.
导入 actual 组件在 Jest 中这样做的最佳方式(据我所知)是:
jest.mock("@chakra-ui/core", () => {
const ui = jest.requireActual("@chakra-ui/core");
return {
...ui,
customKey: 'customValue',
};
})
这样您甚至可以将 自定义函数和 key-values 添加到导入的模块中。