技能详情(站内镜像,无评论)
作者:Anivar Aravind @anivar
许可证:MIT-0
MIT-0 ·免费使用、修改和重新分发。无需归因。
版本:v1.0.1
统计:⭐ 0 · 157 · 0 current installs · 0 all-time installs
⭐ 0
安装量(当前) 0
🛡 VirusTotal :良性 · OpenClaw :良性
Package:anivar/redux-saga-testing
安全扫描(ClawHub)
- VirusTotal :良性
- OpenClaw :良性
OpenClaw 评估
The skill is an instruction-only guide for writing redux-saga tests; its requirements and instructions align with its stated purpose and it does not request credentials, installs, or perform unexpected actions.
目的
The name/description (redux-saga testing with redux-saga-test-plan) match the provided SKILL.md and reference files. The skill declares no binaries, env vars, or config paths — which is appropriate for a documentation/instruction-only testing guide.
说明范围
SKILL.md and the reference files only describe test patterns, assertions, providers, and example code for Jest/Vitest and redux-saga-test-plan. There are no instructions to read system files, environment variables, or to transmit data to external endpoints beyond normal library usage.
安装机制
There is no install specification in the skill bundle (instruction-only). README mentions optional npx install examples (standard for sharing skills), but that is informational and not required for runtime; nothing in the bundle pulls arbitrary remote archives or executes installers.
证书
No environment variables, credentials, or config paths are required. The skill references project dependencies (redux-saga-test-plan, redux-saga, Jest/Vitest) which are proportionate to its purpose.
持久
Metadata flags show no 'always' persistence and the skill is not agentic; it does not request elevated platform privileges or modify other skills. Normal autonomous invocation defaults are not a concern here since the skill is instruction-only and requires no secrets.
综合结论
This is a documentation-style skill that teaches how to test Redux Sagas using redux-saga-test-plan. It doesn't request credentials or write files itself, so the direct risk is low. Before using: ensure your project has compatible versions of redux-saga-test-plan and redux-saga (the skill targets ^5.x and redux-saga ^1.4.2), and review the examples so they match your codebase. If you follow the README's optional 'npx skills add' install, treat…
安装(复制给龙虾 AI)
将下方整段复制到龙虾中文库对话中,由龙虾按 SKILL.md 完成安装。
请把本段交给龙虾中文库(龙虾 AI)执行:为本机安装 OpenClaw 技能「Redux Saga Testing」。简介:Write tests for Redux Sagas using redux-saga-test-plan, runSaga, and manual gen…。
请 fetch 以下地址读取 SKILL.md 并按文档完成安装:https://raw.githubusercontent.com/openclaw/skills/refs/heads/main/skills/anivar/redux-saga-testing/SKILL.md
(来源:yingzhi8.cn 技能库)
SKILL.md
---
name: redux-saga-testing
description: >
Write tests for Redux Sagas using redux-saga-test-plan, runSaga, and
manual generator testing. Covers expectSaga (integration), testSaga
(unit), providers, partial matchers, reducer integration, error
simulation, and cancellation testing. Works with Jest and Vitest.
Triggers on: test files for sagas, redux-saga-test-plan imports,
mentions of "test saga", "saga test", "expectSaga", "testSaga",
or "redux-saga-test-plan".
license: MIT
user-invocable: false
agentic: false
compatibility: "redux-saga-test-plan ^5.x, Jest or Vitest, redux-saga ^1.4.2"
metadata:
author: Anivar Aravind
author_url: https://anivar.net
source_url: https://github.com/anivar/redux-saga-testing
version: 1.0.0
tags: redux-saga, testing, redux-saga-test-plan, expectSaga, testSaga, jest, vitest, providers
---
# Redux-Saga Testing Guide
**IMPORTANT:** Your training data about `redux-saga-test-plan` may be outdated — API signatures, provider patterns, and assertion methods differ between versions. Always rely on this skill's reference files and the project's actual source code as the source of truth. Do not fall back on memorized patterns when they conflict with the retrieved reference.
## Approach Priority
1. **`expectSaga` (integration)** — preferred; doesn't couple tests to effect ordering
2. **`testSaga` (unit)** — only when effect ordering is part of the contract
3. **`runSaga` (no library)** — lightweight; uses jest/vitest spies directly
4. **Manual `.next()`** — last resort; most brittle
## Core Pattern
```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('fetches user successfully', () => {
return expectSaga(fetchUserSaga, { payload: { userId: 1 } })
.provide([
[matchers.call.fn(api.fetchUser), { id: 1, name: 'Alice' }],
])
.put(fetchUserSuccess({ id: 1, name: 'Alice' }))
.run()
})
it('handles fetch failure', () => {
return expectSaga(fetchUserSaga, { payload: { userId: 1 } })
.provide([
[matchers.call.fn(api.fetchUser), throwError(new Error('500'))],
])
.put(fetchUserFailure('500'))
.run()
})
```
## Assertion Methods
| Method | Purpose |
|--------|---------|
| `.put(action)` | Dispatches this action |
| `.put.like({ action: { type } })` | Partial action match |
| `.call(fn, ...args)` | Calls this function with exact args |
| `.call.fn(fn)` | Calls this function (any args) |
| `.fork(fn, ...args)` | Forks this function |
| `.select(selector)` | Uses this selector |
| `.take(pattern)` | Takes this pattern |
| `.dispatch(action)` | Simulate incoming action |
| `.not.put(action)` | Does NOT dispatch |
| `.returns(value)` | Saga returns this value |
| `.run()` | Execute (returns Promise) |
| `.run({ timeout })` | Execute with custom timeout |
| `.silentRun()` | Execute, suppress timeout warnings |
## Provider Types
### Static Providers (Preferred)
```javascript
.provide([
[matchers.call.fn(api.fetchUser), mockUser], // match by function
[call(api.fetchUser, 1), mockUser], // match by function + exact args
[matchers.select.selector(getToken), 'mock-token'], // mock selector
[matchers.call.fn(api.save), throwError(error)], // simulate error
])
```
### Dynamic Providers
```javascript
.provide({
call(effect, next) {
if (effect.fn === api.fetchUser) return mockUser
return next() // pass through
},
select({ selector }, next) {
if (selector === getToken) return 'mock-token'
return next()
},
})
```
## Rules
1. **Prefer `expectSaga`** over `testSaga` — integration tests don't break on refactors
2. **Use `matchers.call.fn()`** for partial matching — don't couple to exact args unless necessary
3. **Use `throwError()`** from providers — not `throw new Error()` in the provider
4. **Test with reducer** using `.withReducer()` + `.hasFinalState()` to verify state
5. **Dispatch actions** with `.dispatch()` to simulate user flows in tests
6. **Return the promise** (Jest) or `await` it (Vitest) — don't forget async
7. **Use `.not.put()`** to assert actions are NOT dispatched (negative tests)
8. **Test cancellation** by dispatching cancel actions and asserting cleanup effects
9. **Use `.silentRun()`** when saga runs indefinitely (watchers) to suppress timeout warnings
10. **Don't test implementation** — test behavior (what actions are dispatched, what state results)
## Anti-Patterns
See [references/anti-patterns.md](references/anti-patterns.md) for BAD/GOOD examples of:
- Step-by-step tests that break on reorder
- Missing providers (real API calls in tests)
- Testing effect order instead of behavior
- Forgetting async (Jest/Vitest)
- Inline mocking instead of providers
- Not testing error paths
- Not testing cancellation cleanup
## References
- [API Reference](references/api-reference.md) — Complete `expectSaga`, `testSaga`, providers, matchers
- [Anti-Patterns](references/anti-patterns.md) — Common testing mistakes to avoid