Skip to content
Back to skills

Jest

ASecurity

Jest testing framework. Covers unit tests, mocking, and snapshots. Use for testing React and Node.js projects. USE WHEN: user mentions "jest", "jest test", "snapshot test", asks about "jest.fn", "jest.mock", "toMatchSnapshot", "React testing" DO NOT USE FOR: E2E tests - use `playwright` or `cypress`; Vite projects - use `vitest` instead; React component testing alone - combine with `testing-library`

  • 31 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 8, 2026
ai-agentsjavascripttypescriptjavareactvuenodespringtestinggitapi

Works with

  • api
  • mcp

Security analysis

A100/100

Pro scans all 3 files and shows the line behind each finding

Scanned September 8, 2026

npx -y skills add claude-dev-suite/claude-dev-suite --skill jest --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Jest?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Jest
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/claude-dev-suite-jest/badge)](https://www.skillsdirectory.com/skills/claude-dev-suite-jest)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: jest
description: |
  Jest testing framework. Covers unit tests, mocking, and snapshots.
  Use for testing React and Node.js projects.

  USE WHEN: user mentions "jest", "jest test", "snapshot test", asks about "jest.fn", "jest.mock", "toMatchSnapshot", "React testing"

  DO NOT USE FOR: E2E tests - use `playwright` or `cypress`; Vite projects - use `vitest` instead; React component testing alone - combine with `testing-library`
allowed-tools: Read, Grep, Glob, Write, Edit
---
# Jest Core Knowledge

> **Deep Knowledge**: Use `mcp__documentation__fetch_docs` with technology: `jest` for comprehensive documentation.

## When NOT to Use This Skill

- **E2E Testing** - Use `playwright` or `cypress` for browser automation
- **Vite Projects** - Use `vitest` which is faster and Vite-native
- **Component Testing Alone** - Combine with `testing-library` for React/Vue components
- **API Integration Tests** - Use framework-specific skills (spring-boot-integration, etc.)

## Basic Test

```typescript
describe('UserService', () => {
  let service: UserService;

  beforeEach(() => {
    service = new UserService();
  });

  afterEach(() => {
    jest.clearAllMocks();
  });

  it('should create user', async () => {
    const user = await service.create({ name: 'John' });
    expect(user.name).toBe('John');
  });
});
```

## Mocking

```typescript
// Mock function
const mockFn = jest.fn();
mockFn.mockReturnValue(42);
mockFn.mockResolvedValue({ data: [] });

// Mock module
jest.mock('./api', () => ({
  fetchUsers: jest.fn().mockResolvedValue([])
}));

// Spy
const spy = jest.spyOn(console, 'log');
expect(spy).toHaveBeenCalledWith('message');

// Mock implementation
mockFn.mockImplementation((x) => x * 2);
```

## Matchers

```typescript
// Same as Vitest, Jest-compatible
expect(value).toBe(exact);
expect(value).toEqual(deepEqual);
expect(obj).toMatchObject({ name: 'John' });
expect(arr).toContainEqual({ id: 1 });
```

## Snapshots

```typescript
it('should match snapshot', () => {
  const component = render(<UserCard user={user} />);
  expect(component).toMatchSnapshot();
});

it('should match inline snapshot', () => {
  expect(formatDate(date)).toMatchInlineSnapshot(`"2024-01-15"`);
});
```

## Async Testing

```typescript
it('should resolve', async () => {
  await expect(fetchData()).resolves.toEqual({ data: [] });
});

it('should reject', async () => {
  await expect(fetchFail()).rejects.toThrow('Error');
});
```

## Config

```javascript
// jest.config.js
module.exports = {
  testEnvironment: 'jsdom',
  setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
  moduleNameMapper: { '^@/(.*)$': '<rootDir>/src/$1' }
};
```

## Production Readiness

### Test Organization

```typescript
// Isolated tests with proper setup/teardown
describe('OrderService', () => {
  let service: OrderService;
  let mockRepository: jest.Mocked<OrderRepository>;

  beforeEach(() => {
    mockRepository = {
      findById: jest.fn(),
      save: jest.fn(),
      delete: jest.fn(),
    } as jest.Mocked<OrderRepository>;

    service = new OrderService(mockRepository);
  });

  afterEach(() => {
    jest.clearAllMocks();
  });

  describe('processOrder', () => {
    it('should process valid order', async () => {
      // Arrange
      const order = createTestOrder({ status: 'pending' });
      mockRepository.findById.mockResolvedValue(order);
      mockRepository.save.mockResolvedValue({ ...order, status: 'processed' });

      // Act
      const result = await service.processOrder(order.id);

      // Assert
      expect(result.status).toBe('processed');
      expect(mockRepository.save).toHaveBeenCalledWith(
        expect.objectContaining({ status: 'processed' })
      );
    });
  });
});
```

### Coverage Configuration

```javascript
// jest.config.js
module.exports = {
  collectCoverageFrom: [
    'src/**/*.{ts,tsx}',
    '!src/**/*.d.ts',
    '!src/**/index.ts',
    '!src/**/*.stories.tsx',
  ],
  coverageThreshold: {
    global: {
      branches: 75,
      functions: 80,
      lines: 80,
      statements: 80,
    },
  },
  coverageReporters: ['text', 'lcov', 'html'],
};
```

### CI Integration

```yaml
# GitHub Actions
- name: Run tests
  run: npm test -- --ci --coverage --reporters=default --reporters=jest-junit
  env:
    JEST_JUNIT_OUTPUT_DIR: ./reports

- name: Upload coverage
  uses: codecov/codecov-action@v3
```

```json
// package.json
{
  "scripts": {
    "test": "jest",
    "test:ci": "jest --ci --coverage --maxWorkers=2",
    "test:watch": "jest --watch"
  }
}
```

### Performance Optimization

```javascript
// jest.config.js - Speed up tests
module.exports = {
  // Run tests in parallel
  maxWorkers: '50%',

  // Cache transformations
  cacheDirectory: '<rootDir>/.jest-cache',

  // Only run affected tests
  onlyChanged: true,

  // Fail fast in CI
  bail: process.env.CI ? 1 : 0,
};
```

### Monitoring Metrics

| Metric | Target |
|--------|--------|
| Line coverage | > 80% |
| Branch coverage | > 75% |
| Test execution time | < 120s |
| Flaky test rate | 0% |

### Checklist

- [ ] Arrange-Act-Assert pattern
- [ ] Isolated tests (no shared state)
- [ ] Coverage thresholds enforced
- [ ] CI/CD integration with reporting
- [ ] jest.clearAllMocks() in afterEach
- [ ] Meaningful test descriptions
- [ ] Async tests properly awaited
- [ ] Snapshot tests reviewed
- [ ] Test data factories
- [ ] Error scenarios covered

## Anti-Patterns

| Anti-Pattern | Why It's Bad | Solution |
|--------------|--------------|----------|
| Over-using snapshots | Tests pass without validation | Use snapshots sparingly, prefer explicit assertions |
| Not reviewing snapshot changes | Bugs slip into snapshots | Always review snapshot diffs manually |
| Testing implementation details | Brittle tests | Test user-facing behavior |
| Shared mutable state | Flaky tests | Isolate setup with beforeEach |
| Skipping error paths | Production failures | Test both success and error scenarios |
| Large snapshot files | Hard to review | Break into smaller focused snapshots |
| No mock cleanup | Tests affect each other | jest.clearAllMocks() in afterEach |

## Quick Troubleshooting

| Problem | Likely Cause | Solution |
|---------|--------------|----------|
| "Cannot find module" | Mock path incorrect | Ensure mock path matches import exactly |
| Test timeout | Missing await | Add await to all async operations |
| "Received: serializes to same string" | Object reference comparison | Use toEqual() not toBe() for objects |
| Snapshot mismatch | Intentional code change | Review diff, update with -u flag if correct |
| "expect().resolves is not a function" | Old Jest version | Update to Jest 27+ or use async/await |
| Tests pass locally, fail in CI | Timezone/locale differences | Mock Date, use fixed timezones |

## Reference Documentation
- [Mocking](quick-ref/mocking.md)
- [Snapshots](quick-ref/snapshots.md)

Files in this skill

  • SKILL.md6.7 KB
  • quick-ref/basics.md3.4 KB
  • quick-ref/mocking.md4.5 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.