Learn-skills.dev write-tests
install
source · Clone the upstream repo
git clone https://github.com/NeverSight/learn-skills.dev
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/NeverSight/learn-skills.dev "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/skills-md/acedergren/agentic-tools/write-tests" ~/.claude/skills/neversight-learn-skills-dev-write-tests && rm -rf "$T"
manifest:
data/skills-md/acedergren/agentic-tools/write-tests/SKILL.mdsource content
Write Tests for Existing Code
Before Writing, Ask Yourself
- Module type? Route handler, repository, plugin, utility, or service — each has a different mock strategy
- Blast radius? Does this module have side effects (DB writes, API calls) that need isolation?
- Nearest test file? Find the closest
and match its structure exactly*.test.ts
Mock Strategy by Module Type
| Module Type | Strategy |
|---|---|
| Route handler | Test app builder + session simulation + |
| Repository | Mock DB connection + counter-based |
| Framework plugin | Real framework instance + selective dependency mocks |
| Pure utility | No mocks — test inputs/outputs directly |
| Service w/ DI | Mock injected deps via forwarding pattern |
Mock Setup (mockReset: true)
If your test runner uses
mockReset: true, most examples from the internet will silently fail.
const { mockFn } = vi.hoisted(() => ({ mockFn: vi.fn(), })); vi.mock("./dependency", () => ({ dependency: (...args: unknown[]) => mockFn(...args), })); beforeEach(() => { // MUST reconfigure here — mockReset clears return values between tests mockFn.mockResolvedValue(defaultResult); });
For complex TDZ cases (multiple interdependent mocks), use the globalThis registry pattern.
NEVER
- NEVER chain
—mockResolvedValueOnce
clears the chain between tests. Use counter-basedmockReset
instead.mockImplementation - NEVER define mock variables at module scope then reference in
factories — hoisting creates a temporal dead zone. Usevi.mock()
or globalThis.vi.hoisted() - NEVER
for modules with side effects — use selective re-exports.vi.importActual() - NEVER test implementation details (private state, internal call order) — test behavior through the public API.
- NEVER copy mock patterns from other projects — check YOUR test runner config first.
- NEVER modify source code — this skill writes tests only.
Metacognitive Rule
If >3 tests fail on first run: STOP. The root cause is almost certainly a mock wiring issue affecting all tests, not individual test logic errors. Re-examine the mock setup strategy holistically before fixing tests one by one.
Run
npx vitest run <test-file> --reporter=verbose
Arguments
: Path to the source file or module to cover$ARGUMENTS- Example:
/write-tests src/routes/admin/settings.ts - If empty, ask the user which file needs test coverage
- Example: