本文档提供了有关如何有效测试 Redux 应用程序的全面指南。它涵盖了测试 Redux 代码的各个方面的方法、工具和最佳实践,包括 reducers、action creators、middleware 以及与 React 组件的集成。
有关 Redux 的 TypeScript 用法,请参阅 TypeScript 用法。
Redux 应用程序因其可预测的状态管理和单向数据流而受益于测试。Redux 团队建议在测试 Redux 应用程序时遵循这些原则。
“你的测试越接近你的软件使用方式,它们就越能给你带来信心。” - Kent C. Dodds
对于 Redux 应用程序的测试,核心建议是:
来源:docs/usage/WritingTests.mdx1-38
Redux 可以与任何测试运行器一起测试,尽管 Jest 和 Vitest 是常用的
两个测试运行器都需要配置为编译 JavaScript/TypeScript,并提供具有 JSDOM 的模拟 DOM 环境以进行 UI 测试。
Redux 团队推荐:
来源:docs/usage/WritingTests.mdx39-72
推荐的方法是通过集成测试来测试 Redux 连接的组件,以验证完整的流程是否协同工作。
考虑这个用户 slice 和获取用户数据的组件的简化示例。
userSlice.ts 包含用于获取用户的 reducers 和 async thunk。store.ts 配置 Redux store。UserDisplay.tsx 是一个显示和获取用户数据的组件。要正确测试 Redux 连接的组件,您需要:
<Provider>` 包裹组件。这是这个自定义渲染函数样子的简化结构。
来源:docs/usage/WritingTests.mdx73-296
一个合适的集成测试应该:
示例测试如下所示:
来源:docs/usage/WritingTests.mdx297-418
为了设置特定的测试场景,您可以通过以下两种方式提供初始状态:
preloadedState 传递给自定义渲染函数。来源:docs/usage/WritingTests.mdx419-452
虽然在大多数情况下推荐集成测试,但有时对单个 Redux 片段进行单元测试仍然是有价值的。
由于 reducers 是基于 action 转换状态的纯函数,因此它们很容易测试。
示例
来源:[docs/usage/WritingTests.mdx:453-697],test/createStore.spec.ts1-546 test/combineReducers.spec.ts1-383
要测试 middleware,您需要:
测试文件中的示例
来源:test/applyMiddleware.spec.ts1-152 docs/usage/WritingCustomMiddleware.md1-118
Thunks 包含分派 action 的异步逻辑。要测试它们:
测试中的示例
来源:test/applyMiddleware.spec.ts67-116 test/helpers/actionCreators.ts17-33
在使用 TypeScript 测试 Redux 应用程序时,请确保您的测试正确键入:
像 useAppDispatch 和 useAppSelector 这样的预定义 hooks,可以使测试 TypeScript Redux 应用程序更加容易。
来源:docs/usage/UsageWithTypescript.md1-726 docs/tutorials/typescript.md63-84 examples/counter-ts/src/app/hooks.ts1-7
Store 设置:
组件测试:
Action 测试:
Reducer 测试:
来源:docs/usage/WritingTests.mdx1-697
在测试具有服务器端渲染的 Redux 应用程序时,额外的注意事项包括:
对于 Next.js 应用程序:
测试关键领域:
来源:docs/usage/nextjs.mdx29-408 docs/usage/ServerRendering.md1-210
Redux 应用程序的测试受益于 Redux 本身的可预测性。通过专注于具有真实 store 实例的集成测试,您可以高置信度地测试完整的用户流程。单元测试对于复杂的边缘情况仍然有用,但次于集成测试。
有效 Redux 测试的关键在于尽可能使用真实的 Redux 逻辑,仅模拟 API 调用等外部依赖项,并验证 UI 是否根据用户交互和状态更改正确更新。
请记住,最终,用户并不关心您是否正在使用 Redux - 他们只关心应用程序是否正常工作。因此,请进行相应的测试,专注于用户行为而不是实现细节。