关于 jest-generator
用于为 JavaScript 和 TypeScript 项目生成 Jest 单元测试的技能,提供测试组织、模拟、React 组件测试和覆盖率检查方面的指导。
主要功能
- 01生成 Jest 测试
- 02源文件与测试文件命名规则
- 03Mock 与 Spy 模式
- 04异步与计时器测试
- 05React 组件测试示例
- 06测试质量检查清单
适用场景
- 01为 JS 或 TS 模块创建测试
- 02测试 React 组件
- 03为现有代码补充覆盖率
- 04检查异步行为与错误处理
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ secondsky/ claude-skills --skill jest-generator安装后在 Claude Code 中输入/jest-generator确认已加载。
详细介绍
Jest 生成器技能
用途
为 JavaScript 和 TypeScript 代码生成基于 Jest 的单元测试,遵循 Jest 惯例和最佳实践,并正确使用模拟、describe 块和代码组织方式。
使用场景
- 为 JavaScript/TypeScript 模块生成 Jest 测试
- 为 React 组件创建测试文件
- 为现有代码补充缺失的测试覆盖
- 需要 Jest 专属模式(模拟、间谍、快照)
测试文件命名
源文件与测试文件的映射:
src/components/Feature.tsx→src/components/Feature.test.tsxsrc/utils/validator.ts→src/utils/validator.test.tssrc/models/User.ts→src/models/User.test.ts
运行测试
# Preferred: Using bun (faster)
bun test
# Run specific file
bun test src/utils/validator.test.ts
# Run with coverage
bun test --coverage
# Watch mode
bun test --watch
# Alternative: Using npm
npm test
npm test -- --coverage
Jest 测试结构
import { functionToTest, ClassToTest } from './Feature'
jest.mock('./dependency')
describe('ModuleName', () => {
beforeEach(() => {
jest.clearAllMocks()
})
afterEach(() => {
jest.restoreAllMocks()
})
describe('ClassName', () => {
let instance: ClassToTest
beforeEach(() => {
instance = new ClassToTest()
})
it('should return expected result with valid input', () => {
// Arrange
const input = { key: 'value' }
const expected = { processed: true }
// Act
const result = instance.method(input)
// Assert
expect(result).toEqual(expected)
})
it('should throw error with invalid input', () => {
expect(() => instance.method(null)).toThrow('Invalid input')
})
})
})
Jest 专属模式
模拟
// Mock entire module
jest.mock('./api', () => ({
fetchData: jest.fn(),
}))
// Mock with implementation
const mockFn = jest.fn((x: number) => x * 2)
// Spy on method
const spy = jest.spyOn(obj, 'method').mockReturnValue('mocked')
spy.mockRestore()
异步测试
it('should resolve with data', async () => {
const result = await asyncFunction()
expect(result).toBeDefined()
})
it('should reject with error', async () => {
await expect(asyncFunction()).rejects.toThrow('Error')
})
计时器
beforeEach(() => jest.useFakeTimers())
afterEach(() => jest.useRealTimers())
it('should execute after timeout', () => {
const callback = jest.fn()
setTimeout(callback, 1000)
jest.advanceTimersByTime(1000)
expect(callback).toHaveBeenCalled()
})
常用匹配器
// Equality
expect(value).toBe(expected)
expect(value).toEqual(expected)
// Truthiness
expect(value).toBeTruthy()
expect(value).toBeNull()
expect(value).toBeDefined()
// Arrays/Objects
expect(array).toContain(item)
expect(obj).toHaveProperty('key')
// Functions/Promises
expect(fn).toThrow('error')
await expect(promise).resolves.toBe(value)
// Mock functions
expect(mockFn).toHaveBeenCalled()
expect(mockFn).toHaveBeenCalledWith(arg)
React 组件测试
import { render, screen, fireEvent } from '@testing-library/react'
import '@testing-library/jest-dom'
import { Button } from './Button'
describe('Button', () => {
it('should call onClick when clicked', () => {
const handleClick = jest.fn()
render(<Button onClick={handleClick}>Click me</Button>)
fireEvent.click(screen.getByText('Click me'))
expect(handleClick).toHaveBeenCalledTimes(1)
})
})
质量检查清单
- 测试文件命名正确(
<module>.test.ts) - 测试所有导出的函数/类
- 包含正常流程和边缘情况
- 测试错误条件
- 模拟外部依赖
- 使用 describe 块组织测试
- 使用 beforeEach/afterEach 进行设置/清理
- 测试名称清晰明确
- 覆盖率 ≥ 80%
最佳实践
- 使用清晰的测试名称:
should <expected> when <condition> - 使用 describe 块组织测试
- 仅模拟外部依赖
- 针对组件测试用户行为
- 使用 test.each 编写参数化测试
- 保持测试彼此独立
- 测试错误条件
- 力求覆盖率达到 80% 以上
评论
支持 Markdown