skills-ws
Version:
87 agent skills for AI coding assistants — marketing, growth, web3, dev, design & operations. Built for OpenClaw, Claude Code, Cursor, and Codex.
64 lines (49 loc) • 1.79 kB
Markdown
## Contents
- Snapshot Testing
- When to Use
- Best Practices
- Snapshot Hygiene
## Snapshot Testing
### When to Use
✅ **Good for:** Serialized component output, API response shapes, config file generation, error messages
❌ **Avoid for:** Large/frequently changing outputs, CSS (use visual regression instead), implementation details
### Best Practices
```tsx
// snapshot.test.tsx
import { test, expect } from 'vitest';
import { render } from '@testing-library/react'; // needs jsdom/happy-dom env
import { Alert } from '@/components/Alert';
import { formatDisplayName } from '@/lib/format';
// ✅ Inline snapshots for small, focused assertions
test('formats user display name', () => {
expect(formatDisplayName({ first: 'Jane', last: 'Doe' }))
.toMatchInlineSnapshot(`"Jane Doe"`);
});
// ✅ Named snapshots for component output
test('renders error state', () => {
const { container } = render(<Alert type="error" message="Failed" />);
expect(container).toMatchSnapshot('alert-error');
});
// ❌ Avoid: massive snapshots that nobody reviews
test('renders entire page', () => {
expect(render(<DashboardPage />).container).toMatchSnapshot(); // 500+ lines nobody reads
});
```
### Snapshot Hygiene
```bash
# Update snapshots after intentional changes
npx vitest --update
npx jest --updateSnapshot
# CI: fail on obsolete snapshots
npx jest --ci # --ci flag makes Jest fail on new snapshots (must be committed)
```
```typescript
// Keep snapshots small — use property matchers
test('creates user with generated fields', () => {
expect(createUser({ name: 'Test' })).toMatchSnapshot({
id: expect.any(String),
createdAt: expect.any(Date),
});
});
```
**Rule:** If a snapshot is >50 lines, break the test into smaller assertions or use inline snapshots.