react-testing
React Testing Library
This skill focuses on React-specific testing patterns. For general DOM testing patterns (queries, userEvent, async, accessibility), load the frontend-testing skill. For TDD workflow, load the tdd skill.
Core Principles
React components are functions - Test them like functions: inputs (props) → output (rendered DOM).
Test behavior, not implementation:
- ✅ Test what users see and do
- ✅ Test through public APIs (props, rendered output)
- ❌ Don't test component state
- ❌ Don't test component methods
- ❌ Don't use shallow rendering
Modern RTL handles cleanup automatically:
- No manual
act()for render, userEvent, or async queries - No manual
cleanup()- it's automatic - Use factory functions instead of
beforeEach
Quick Reference
| Topic | Guide |
|---|---|
| Testing components, props, and conditional rendering | components.md |
| Testing custom hooks with renderHook | hooks.md |
| Testing context providers and consumers | context.md |
| Testing form inputs, submissions, and validation | forms.md |
| Common React testing mistakes to avoid | anti-patterns.md |
| Loading states, error boundaries, portals, Suspense | advanced.md |
When to Use Each Guide
Components
Use components.md when you need:
- Basic component testing patterns
- Testing how props affect rendered output
- Testing conditional rendering
- Examples of correct vs incorrect component tests
Hooks
Use hooks.md when you need:
- Testing custom hooks with
renderHook - Using
result.current,act(), andrerender() - Testing hooks with props
Context
Use context.md when you need:
- Using the
wrapperoption with providers - Setting up multiple providers
- Creating custom render functions for context
- Testing components that consume context
Forms
Use forms.md when you need:
- Testing controlled inputs
- Testing form submissions
- Testing form validation
- User interaction patterns with forms
Anti-Patterns
Use anti-patterns.md when you need:
- When to avoid manual
act()wrapping - Why manual
cleanup()is unnecessary - Avoiding
beforeEachrender patterns - Why to avoid testing component internals
- Why shallow rendering is problematic
Advanced
Use advanced.md when you need:
- Testing loading states
- Testing error boundaries
- Testing portals
- Testing React Suspense
Summary Checklist
React-specific checks:
- Using
render()from @testing-library/react (not enzyme's shallow/mount) - Using
renderHook()for custom hooks - Using
wrapperoption for context providers - No manual
act()calls (RTL handles it) - No manual
cleanup()calls (automatic) - Testing component output, not internal state
- Using factory functions, not
beforeEachrender - Following TDD workflow (see
tddskill) - Using general DOM testing patterns (see
frontend-testingskill)
More from mintuz/claude-plugins
gps-method
Evidence-based goal achievement framework using Goal, Plan, and System methodology. Use when users want to set goals, create actionable plans, build execution systems, or diagnose why they're struggling to make progress on existing goals. Triggers include requests to "set a goal", "help me achieve", "create a plan", "why am I not making progress", or similar goal-setting and achievement queries.
21app-store-scraper
>
19local-ai-models
Comprehensive guide for implementing on-device AI models on iOS using Foundation Models and MLX Swift frameworks. Use WHEN building iOS apps with (1) Local LLM inference, (2) Vision Language Models (VLMs), (3) Text embeddings, (4) Image generation, (5) Tool/function calling, (6) Multi-turn conversations, (7) Custom model integration, or (8) Structured generation.
17web-design
WHEN refining UI layout, typography, color, or polish; NOT code implementation; provides concise principles for intentional, legible design.
17eyes
WHEN users express dissatisfaction with visual appearance or behavior; use Playwright MCP to capture screenshots and collaborate on UI fixes with a structured feedback loop.
13swiftui-architecture
WHEN building SwiftUI views, managing state, setting up shared services, or making architectural decisions; NOT for UIKit or legacy patterns; provides pure SwiftUI data flow without ViewModels using @State, @Binding, @Observable, and @Environment.
10