返回

用React Testing Library 构建无痛测试

前端


前言

大家好,我对于当时的测试生态不太满意,所以写了个测试库 React Testing Library。这个库的主要设计目标是让你尽可能的专注于测试逻辑,而非测试实现细节。测试代码应该通俗易懂,只需要你懂 React,而不用有太多 DOM 和实现细节的知识。

在本文中,我将介绍使用 React Testing Library 时容易遇到的常见错误。

错误 1:查找真实 DOM 元素

当你使用 React Testing Library 时,你应该避免查找真实 DOM 元素。这是因为真实 DOM 元素很容易改变,这可能会导致你的测试变得脆弱。例如,如果你使用 document.querySelector 来查找一个按钮,那么当按钮的类名改变时,你的测试就会失败。

正确的做法是使用 React Testing Library 提供的查询函数来查找元素。这些查询函数会根据 React 的组件结构来查找元素,因此它们不会受到真实 DOM 元素的变化的影响。例如,你可以使用 getByTestId 函数来查找一个按钮,如下所示:

const button = getByTestId('my-button');

错误 2:在测试中使用 setState

在测试中使用 setState 是一个常见的错误。这是因为 setState 会改变组件的状态,这可能会导致测试变得脆弱。例如,如果你使用 setState 来改变一个按钮的禁用状态,那么当按钮的状态改变时,你的测试就会失败。

正确的做法是使用 React Testing Library 提供的 fireEvent 函数来模拟用户交互。例如,你可以使用 fireEvent.click 函数来模拟用户点击一个按钮,如下所示:

fireEvent.click(button);

错误 3:在测试中使用 useEffect

在测试中使用 useEffect 也是一个常见的错误。这是因为 useEffect 会在组件挂载和更新时运行,这可能会导致你的测试变得脆弱。例如,如果你使用 useEffect 来获取数据,那么当数据发生变化时,你的测试就会失败。

正确的做法是使用 React Testing Library 提供的 act 函数来模拟组件的挂载和更新。例如,你可以使用 act 函数来模拟组件的挂载,如下所示:

act(() => {
  render(<MyComponent />);
});

错误 4:在测试中使用 useLayoutEffect

在测试中使用 useLayoutEffect 也是一个常见的错误。这是因为 useLayoutEffect 会在组件挂载和更新后运行,这可能会导致你的测试变得脆弱。例如,如果你使用 useLayoutEffect 来获取数据,那么当数据发生变化时,你的测试就会失败。

正确的做法是使用 React Testing Library 提供的 act 函数来模拟组件的挂载和更新。例如,你可以使用 act 函数来模拟组件的挂载,如下所示:

act(() => {
  render(<MyComponent />);
});

错误 5:在测试中使用 useCallback

在测试中使用 useCallback 也是一个常见的错误。这是因为 useCallback 会返回一个缓存的函数,这可能会导致你的测试变得脆弱。例如,如果你使用 useCallback 来获取数据,那么当数据发生变化时,你的测试就会失败。

正确的做法是使用 React Testing Library 提供的 act 函数来模拟组件的挂载和更新。例如,你可以使用 act 函数来模拟组件的挂载,如下所示:

act(() => {
  render(<MyComponent />);
});

错误 6:在测试中使用 useMemo

在测试中使用 useMemo 也是一个常见的错误。这是因为 useMemo 会返回一个缓存的值,这可能会导致你的测试变得脆弱。例如,如果你使用 useMemo 来获取数据,那么当数据发生变化时,你的测试就会失败。

正确的做法是使用 React Testing Library 提供的 act 函数来模拟组件的挂载和更新。例如,你可以使用 act 函数来模拟组件的挂载,如下所示:

act(() => {
  render(<MyComponent />);
});

错误 7:在测试中使用 useReducer

在测试中使用 useReducer 也是一个常见的错误。这是因为 useReducer 会返回一个 reducer 函数和一个状态值,这可能会导致你的测试变得脆弱。例如,如果你使用 useReducer 来获取数据,那么当数据发生变化时,你的测试就会失败。

正确的做法是使用 React Testing Library 提供的 act 函数来模拟组件的挂载和更新。例如,你可以使用 act 函数来模拟组件的挂载,如下所示:

act(() => {
  render(<MyComponent />);
});

错误 8:在测试中使用 useContext

在测试中使用 useContext 也是一个常见的错误。这是因为 useContext 会返回一个 context 值,这可能会导致你的测试变得脆弱。例如,如果你使用 useContext 来获取数据,那么当数据发生变化时,你的测试就会失败。

正确的做法是使用 React Testing Library 提供的 act 函数来模拟组件的挂载和更新。例如,你可以使用 act 函数来模拟组件的挂载,如下所示:

act(() => {
  render(<MyComponent />);
});

错误 9:在测试中使用 useRef

在测试中使用 useRef 也是一个常见的错误。这是因为 useRef 会返回一个 ref 对象,这可能会导致你的测试变得脆弱。例如,如果你使用 useRef 来获取数据,那么当数据发生变化时,你的测试就会失败。

正确的做法是使用 React Testing Library 提供的 act 函数来模拟组件的挂载和更新。例如,你可以使用 act 函数来模拟组件的挂载,如下所示:

act(() => {
  render(<MyComponent />);
});

错误 10:在测试中使用 useEffect

在测试中使用 useEffect 也是一个常见的错误。这是因为 useEffect 会在组件挂载和更新时运行,这可能会导致你的测试变得脆弱。例如,如果你使用 useEffect 来获取数据,那么当数据发生变化时,你的测试就会失败。

正确的做法是使用 React Testing Library 提供的 act 函数来模拟组件的挂载和更新。例如,你可以使用 act 函数来模拟组件的挂载,如下所示:

act(() => {
  render(<MyComponent />);
});

总结

我希望本文能帮助你避免在使用 React Testing Library 时遇到的一些常见错误。如果您在使用 React Testing Library 时遇到任何问题,请随时在 GitHub 上提交 issue。