返回顶部
r

redux-saga-testingredux-saga测试

>

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 1.0.1
安全检测
已通过
257
下载量
免费
免费
0
收藏
概述
安装方式
版本历史

redux-saga-testing

Redux-Saga 测试指南

重要提示: 您关于 redux-saga-test-plan 的训练数据可能已过时——不同版本的 API 签名、提供者模式和断言方法存在差异。请始终以本技能的参考文件和项目的实际源代码为准。当记忆中的模式与检索到的参考信息冲突时,不要依赖记忆中的模式。

方法优先级

  1. 1. expectSaga(集成测试) — 首选;不将测试与 effect 顺序耦合
  2. testSaga(单元测试) — 仅当 effect 顺序是约定的一部分时使用
  3. runSaga(无库) — 轻量级;直接使用 jest/vitest 间谍
  4. 手动 .next() — 最后手段;最脆弱

核心模式

javascript
import { expectSaga } from redux-saga-test-plan
import * as matchers from redux-saga-test-plan/matchers
import { throwError } from redux-saga-test-plan/providers

it(成功获取用户, () => {
return expectSaga(fetchUserSaga, { payload: { userId: 1 } })
.provide([
[matchers.call.fn(api.fetchUser), { id: 1, name: Alice }],
])
.put(fetchUserSuccess({ id: 1, name: Alice }))
.run()
})

it(处理获取失败, () => {
return expectSaga(fetchUserSaga, { payload: { userId: 1 } })
.provide([
[matchers.call.fn(api.fetchUser), throwError(new Error(500))],
])
.put(fetchUserFailure(500))
.run()
})

断言方法

方法用途
.put(action)分发此 action
.put.like({ action: { type } })
部分匹配 action | | .call(fn, ...args) | 使用精确参数调用此函数 | | .call.fn(fn) | 调用此函数(任意参数) | | .fork(fn, ...args) | 分叉此函数 | | .select(selector) | 使用此选择器 | | .take(pattern) | 获取此模式 | | .dispatch(action) | 模拟传入的 action | | .not.put(action) | 不分发 | | .returns(value) | Saga 返回此值 | | .run() | 执行(返回 Promise) | | .run({ timeout }) | 使用自定义超时执行 | | .silentRun() | 执行,抑制超时警告 |

提供者类型

静态提供者(首选)

javascript
.provide([
[matchers.call.fn(api.fetchUser), mockUser], // 按函数匹配
[call(api.fetchUser, 1), mockUser], // 按函数 + 精确参数匹配
[matchers.select.selector(getToken), mock-token], // 模拟选择器
[matchers.call.fn(api.save), throwError(error)], // 模拟错误
])

动态提供者

javascript
.provide({
call(effect, next) {
if (effect.fn === api.fetchUser) return mockUser
return next() // 透传
},
select({ selector }, next) {
if (selector === getToken) return mock-token
return next()
},
})

规则

  1. 1. 优先使用 expectSaga 而非 testSaga — 集成测试在重构时不会中断
  2. 使用 matchers.call.fn() 进行部分匹配 — 除非必要,否则不要与精确参数耦合
  3. 使用 throwError()(来自 providers)— 不要在提供者中使用 throw new Error()
  4. 使用 .withReducer() + .hasFinalState() 结合 reducer 测试以验证状态
  5. 使用 .dispatch() 分发 action 以模拟测试中的用户流程
  6. 返回 promise(Jest)或 await 它(Vitest)— 不要忘记异步
  7. 使用 .not.put() 断言 action 未被分发(负面测试)
  8. 测试取消 通过分发取消 action 并断言清理效果
  9. 使用 .silentRun() 当 saga 无限运行(观察者)时,抑制超时警告
  10. 不要测试实现 — 测试行为(分发什么 action,产生什么状态结果)

反模式

请参阅 references/anti-patterns.md 了解错误/正确示例:

  • - 因重新排序而中断的逐步测试
  • 缺少提供者(测试中的真实 API 调用)
  • 测试 effect 顺序而非行为
  • 忘记异步(Jest/Vitest)
  • 使用内联模拟而非提供者
  • 未测试错误路径
  • 未测试取消清理

参考

  • - API 参考 — 完整的 expectSaga、testSaga、提供者、匹配器
  • 反模式 — 需要避免的常见测试错误

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 redux-saga-testing-1776207731 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 redux-saga-testing-1776207731 技能

通过命令行安装

skillhub install redux-saga-testing-1776207731

下载

⬇ 下载 redux-saga-testing v1.0.1(免费)

文件大小: 9.83 KB | 发布时间: 2026-4-15 11:04

v1.0.1 最新 2026-4-15 11:04
Added source_url linking to GitHub repo

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部