mcpField
J
jest-generator

jest-generator

github.com/secondsky测试与质量240380 次安装5 周前更新
代码仓库

关于 jest-generator

用于为 JavaScript 和 TypeScript 项目生成 Jest 单元测试的技能,提供测试组织、模拟、React 组件测试和覆盖率检查方面的指导。

主要功能

  1. 01生成 Jest 测试
  2. 02源文件与测试文件命名规则
  3. 03Mock 与 Spy 模式
  4. 04异步与计时器测试
  5. 05React 组件测试示例
  6. 06测试质量检查清单

适用场景

  1. 01为 JS 或 TS 模块创建测试
  2. 02测试 React 组件
  3. 03为现有代码补充覆盖率
  4. 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.tsx
  • src/utils/validator.ts → src/utils/validator.test.ts
  • src/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%

最佳实践

  1. 使用清晰的测试名称:should <expected> when <condition>
  2. 使用 describe 块组织测试
  3. 仅模拟外部依赖
  4. 针对组件测试用户行为
  5. 使用 test.each 编写参数化测试
  6. 保持测试彼此独立
  7. 测试错误条件
  8. 力求覆盖率达到 80% 以上

评论

支持 Markdown