用React Testing Library 构建无痛测试
2024-02-01 07:51:55
前言
大家好,我对于当时的测试生态不太满意,所以写了个测试库 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。