Claude-skill-registry Bun Jest Migration
Use when migrating from Jest to Bun's test runner, import compatibility, mocks, and config.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/bun-jest-migration" ~/.claude/skills/majiayu000-claude-skill-registry-bun-jest-migration && rm -rf "$T"
manifest:
skills/data/bun-jest-migration/SKILL.mdsource content
Bun Jest Migration
Bun's test runner is Jest-compatible. Most Jest tests run without changes.
Quick Migration
# 1. Remove Jest dependencies bun remove jest ts-jest @types/jest babel-jest # 2. Update test script # package.json: "test": "bun test" # 3. Run tests bun test
Import Changes
// Before (Jest) import { describe, it, expect, jest } from '@jest/globals'; // After (Bun) - No import needed, or explicit: import { describe, test, expect, mock, spyOn } from "bun:test";
API Compatibility
Fully Compatible
| Jest | Bun | Notes |
|---|---|---|
| | Identical |
/ | | Use |
| | Same matchers |
| | Identical |
| | Identical |
| | Use |
| | Identical |
Requires Changes
| Jest | Bun Equivalent |
|---|---|
| |
| |
| Third argument to |
| Call on each mock |
Mock Migration
Mock Functions
// Jest const fn = jest.fn().mockReturnValue('value'); // Bun const fn = mock(() => 'value'); // Or for compatibility: import { jest } from "bun:test"; const fn = jest.fn(() => 'value');
Module Mocking
// Jest (top-level hoisting) jest.mock('./utils', () => ({ helper: jest.fn(() => 'mocked') })); // Bun (inline, no hoisting) import { mock } from "bun:test"; mock.module('./utils', () => ({ helper: mock(() => 'mocked') }));
Spy Migration
// Jest jest.spyOn(console, 'log').mockImplementation(() => {}); // Bun (identical) spyOn(console, 'log').mockImplementation(() => {});
Timer Migration
// Jest jest.useFakeTimers(); jest.setSystemTime(new Date('2024-01-01')); jest.advanceTimersByTime(1000); // Bun - supports Jest-compatible timer APIs import { setSystemTime } from "bun:test"; import { jest } from "bun:test"; jest.useFakeTimers(); jest.setSystemTime(new Date('2024-01-01')); jest.advanceTimersByTime(1000); // Now supported
Snapshot Testing
// Jest expect(component).toMatchSnapshot(); expect(data).toMatchInlineSnapshot(`"expected"`); // Bun (identical) expect(component).toMatchSnapshot(); expect(data).toMatchInlineSnapshot(`"expected"`);
Update snapshots:
bun test --update-snapshots
Configuration Migration
jest.config.js → bunfig.toml
// jest.config.js (before) module.exports = { testMatch: ['**/*.test.ts'], testTimeout: 10000, setupFilesAfterEnv: ['./jest.setup.ts'], collectCoverage: true, coverageThreshold: { global: { lines: 80 } } };
# bunfig.toml (after) [test] root = "./" preload = ["./jest.setup.ts"] timeout = 10000 coverage = true coverageThreshold = 0.8
Common Migration Issues
Issue: jest.mock
Not Working
jest.mock// Jest mock hoisting doesn't exist in Bun // Move mock.module before imports or use dynamic imports // Solution 1: Use mock.module at top mock.module('./api', () => ({ fetch: mock() })); import { fetch } from './api'; // Solution 2: Dynamic import const mockFetch = mock(); mock.module('./api', () => ({ fetch: mockFetch })); const { fetch } = await import('./api');
Issue: Timer Functions Missing
// Bun timer support is limited // Use setSystemTime for date mocking import { setSystemTime } from "bun:test"; beforeEach(() => { setSystemTime(new Date('2024-01-01')); }); afterEach(() => { setSystemTime(); // Reset to real time });
Issue: Custom Matchers
// Jest expect.extend({ toBeWithinRange(received, floor, ceiling) {...} }); // Bun (same API) import { expect } from "bun:test"; expect.extend({ toBeWithinRange(received, floor, ceiling) { const pass = received >= floor && received <= ceiling; return { pass, message: () => `expected ${received} to be within ${floor}-${ceiling}` }; } });
Step-by-Step Migration
-
Remove Jest packages
bun remove jest ts-jest @types/jest babel-jest jest-environment-jsdom -
Update package.json
{ "scripts": { "test": "bun test", "test:watch": "bun test --watch", "test:coverage": "bun test --coverage" } } -
Convert jest.config.js to bunfig.toml
-
Update imports in test files
- Find/replace
→@jest/globalsbun:test - Find/replace
→jest.fn()mock() - Find/replace
→jest.mock()mock.module()
- Find/replace
-
Run and fix
bun test 2>&1 | head -50 # Check first errors
Common Errors
| Error | Cause | Fix |
|---|---|---|
| Old import | Use |
| Global jest | Import from |
| Wrong import | |
| Different serialization | Update with |
When to Load References
Load
references/compatibility-matrix.md when:
- Full Jest API compatibility details
- Unsupported features list
- Workarounds for missing features