frontend-testing
Generate or review Vitest and React Testing Library tests for frontend components, hooks, and utilities. USE FOR: "write Vitest tests for a React component", "review coverage gaps in a React hook spec", "review an existing frontend Vitest spec". DO NOT USE FOR: backend or API tests, Playwright or Cypress end-to-end tests, or conceptual questions without frontend code context.
- License 许可
- MIT
- 最近更新
- 2026-10-23
- Stars
- ★ 0
- Forks
- 0
01 前言 Front Matter
- name
- frontend-testing
- description
- Generate or review Vitest and React Testing Library tests for frontend components, hooks, and utilities. USE FOR: "write Vitest tests for a React component", "review coverage gaps in a React hook spec", "review an existing frontend Vitest spec". DO NOT USE FOR: backend or API tests, Playwright or Cypress end-to-end tests, or conceptual questions without frontend code context.
02 资源文件 9
- 资产文件assets/component-test.template.tsx7.4 KB
- 脚本assets/hook-test.template.ts6.0 KB
- 脚本assets/utility-test.template.ts4.1 KB
- 参考文档references/async-testing.md8.2 KB
- 参考文档references/checklist.md5.3 KB
- 参考文档references/common-patterns.md8.2 KB
- 参考文档references/domain-components.md6.6 KB
- 参考文档references/mocking.md14.1 KB
- 参考文档references/workflow.md7.8 KB
03 SKILL.md 正文
Frontend Testing Skill
This skill enables Claude to generate high-quality, comprehensive frontend tests following established conventions and best practices.
When to Apply This Skill
Apply this skill when the user:
- Asks to write tests for a component, hook, or utility
- Asks to review existing tests for completeness
- Mentions Vitest, React Testing Library, RTL, or spec files
- Requests test coverage improvement
- Mentions testing, unit tests, or integration tests for frontend code
- Wants to understand testing patterns in the codebase
Do NOT apply when:
- User is asking about backend/API tests (Python/pytest)
- User is asking about E2E tests (Playwright/Cypress)
- User is only asking conceptual questions without code context
Quick Reference
Tech Stack
| Tool | Purpose |
|---|---|
| Vitest | Test runner |
| React Testing Library | Component testing |
| jsdom | Test environment |
| TypeScript | Type safety |
Key Commands
# Run all tests
pnpm test
# Watch mode
pnpm test:watch
# Run specific file
pnpm test path/to/file.spec.tsx
# Generate coverage report
pnpm test:coverage
File Naming
- Test files:
ComponentName.spec.tsxorComponentName.test.tsx(same directory as component)
Test Structure Template
import { render, screen, fireEvent, waitFor } from '@testing-library/react'
import Component from './index'
// Mock external dependencies only
vi.mock('@/service/api')
vi.mock('next/navigation', () => ({
useRouter: () => ({ push: vi.fn() }),
usePathname: () => '/test',
}))
// Shared state for mocks (if needed)
let mockSharedState = false
describe('ComponentName', () => {
beforeEach(() => {
vi.clearAllMocks() // Reset mocks BEFORE each test
mockSharedState = false // Reset shared state
})
// Rendering tests (REQUIRED)
describe('Rendering', () => {
it('should render without crashing', () => {
// Arrange
const props = { title: 'Test' }
// Act
render(<Component {...props} />)
// Assert
expect(screen.getByText('Test')).toBeInTheDocument()
})
})
// Props tests (REQUIRED)
describe('Props', () => {
it('should apply custom className', () => {
render(<Component className="custom" />)
expect(screen.getByRole('button')).toHaveClass('custom')
})
})
// User Interactions
describe('User Interactions', () => {
it('should handle click events', () => {
const handleClick = vi.fn()
render(<Component onClick={handleClick} />)
fireEvent.click(screen.getByRole('button'))
expect(handleClick).toHaveBeenCalledTimes(1)
})
})
// Edge Cases (REQUIRED)
describe('Edge Cases', () => {
it('should handle null data', () => {
render(<Component data={null} />)
expect(screen.getByText(/no data/i)).toBeInTheDocument()
})
it('should handle empty array', () => {
render(<Component items={[]} />)
expect(screen.getByText(/empty/i)).toBeInTheDocument()
})
})
})
Testing Workflow (CRITICAL)
Incremental Approach Required
NEVER generate all test files at once. For complex components or multi-file directories:
- Analyze & Plan: List all files, order by complexity (simple -> complex)
- Process ONE at a time: Write test -> Run test -> Fix if needed -> Next
- Verify before proceeding: Do NOT continue to next file until current passes
For each file:
1. Write test
2. Run: pnpm test <file>.spec.tsx
3. PASS? -> Mark complete, next file
FAIL? -> Fix first, then continue
Complexity-Based Order
Process in this order for multi-file testing:
- Utility functions (simplest)
- Custom hooks
- Simple components (presentational)
- Medium components (state, effects)
- Complex components (API, routing)
- Integration tests (index files - last)
When to Refactor First
- Complexity > 50: Break into smaller pieces before testing
- 500+ lines: Consider splitting before testing
- Many dependencies: Extract logic into hooks first
See references/workflow.md for complete workflow details and todo list format.
Testing Strategy
Path-Level Testing (Directory Testing)
When assigned to test a directory/path, test ALL content within that path:
- Test all components, hooks, utilities in the directory (not just
indexfile) - Use incremental approach: one file at a time, verify each before proceeding
- Goal: 100% coverage of ALL files in the directory
Integration Testing First
Prefer integration testing when writing tests for a directory:
- Import real project components directly (including base components and siblings)
- Only mock: API services, routing, complex context providers
- DO NOT mock base components
- DO NOT mock sibling/child components in the same directory
See Test Structure Template for correct import/mock patterns.
Core Principles
1. AAA Pattern (Arrange-Act-Assert)
Every test should clearly separate:
- Arrange: Setup test data and render component
- Act: Perform user actions
- Assert: Verify expected outcomes
2. Black-Box Testing
- Test observable behavior, not implementation details
- Use semantic queries (getByRole, getByLabelText)
- Avoid testing internal state directly
- Prefer pattern matching over hardcoded strings in assertions:
// Avoid: hardcoded text assertions
expect(screen.getByText('Loading...')).toBeInTheDocument()
// Better: role-based queries
expect(screen.getByRole('status')).toBeInTheDocument()
// Better: pattern matching
expect(screen.getByText(/loading/i)).toBeInTheDocument()
3. Single Behavior Per Test
Each test verifies ONE user-observable behavior:
// Good: One behavior
it('should disable button when loading', () => {
render(<Button loading />)
expect(screen.getByRole('button')).toBeDisabled()
})
// Bad: Multiple behaviors
it('should handle loading state', () => {
render(<Button loading />)
expect(screen.getByRole('button')).toBeDisabled()
expect(screen.getByText('Loading...')).toBeInTheDocument()
expect(screen.getByRole('button')).toHaveClass('loading')
})
4. Semantic Naming
Use should <behavior> when <condition>:
it('should show error message when validation fails')
it('should call onSubmit when form is valid')
it('should disable input when isReadOnly is true')
Required Test Scenarios
Always Required (All Components)
- Rendering: Component renders without crashing
- Props: Required props, optional props, default values
- Edge Cases: null, undefined, empty values, boundary conditions
Conditional (When Present)
| Feature | Test Focus |
|---|---|
useState |
Initial state, transitions, cleanup |
useEffect |
Execution, dependencies, cleanup |
| Event handlers | All onClick, onChange, onSubmit, keyboard |
| API calls | Loading, success, error states |
| Routing | Navigation, params, query strings |
useCallback/useMemo |
Referential equality |
| Context | Provider values, consumer behavior |
| Forms | Validation, submission, error display |
Coverage Goals (Per File)
For each test file generated, aim for:
- 100% function coverage
- 100% statement coverage
-
95% branch coverage
-
95% line coverage
Note: For multi-file directories, process one file at a time with full coverage each. See
references/workflow.md.
Detailed Guides
For more detailed information, refer to:
references/workflow.md- Incremental testing workflow (MUST READ for multi-file testing)references/mocking.md- Mock patterns, store testing, and best practicesreferences/async-testing.md- Async operations and API callsreferences/domain-components.md- Domain-specific component testingreferences/common-patterns.md- Frequently used testing patternsreferences/checklist.md- Test generation checklist and validation steps
04 同仓库更多 Skills
sample-skill
暂无简介
synthetic-review-candidate
Candidate for smoke testing an evaluation runner only.
synthetic-review-baseline
Baseline for smoke testing an evaluation runner only.
review
Run the existing user-invoked review bundle and independently adjudicate its findings.
review-adjudication
Verify generated or human review findings before fixing, defending, replying, resolving, or reusing them as learned guidance. Use within a review, review-comment fix, monitor, or readiness workflow.
monitor-mr
Monitor review findings and CI using the shared adjudication procedure.