Vitest Testing

提供 Vitest 单元测试与集成测试的模式与最佳实践,涵盖断言、异步测试与模拟方法。

已扫描
适合谁
前端开发工程师、Node.js 项目测试人员
不适合谁
无 JavaScript/TypeScript 开发经验者、非测试相关场景使用者
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @anderskev/vitest-testing

Skill 说明

命令、参数、文件名以原文为准

Vitest 最佳实践

快速参考

import { describe, it, expect, beforeEach, vi } from 'vitest'

describe('功能名称', () => {
  beforeEach(() => {
    vi.clearAllMocks()
  })

  it('应完成特定操作', () => {
    expect(actual).toBe(expected)
  })

  it.todo('待实现的测试')
  it.skip('临时禁用的测试')
  it.only('开发时仅运行此测试')
})

常见断言

// 相等性
expect(value).toBe(42)                    // 严格相等(===)
expect(obj).toEqual({ a: 1 })             // 深度相等
expect(obj).toStrictEqual({ a: 1 })       // 严格深度相等(检查类型)

// 布尔值判断
expect(value).toBeTruthy()
expect(value).toBeFalsy()
expect(value).toBeNull()
expect(value).toBeUndefined()

// 数字
expect(0.1 + 0.2).toBeCloseTo(0.3)
expect(value).toBeGreaterThan(5)

// 字符串/数组
expect(str).toMatch(/pattern/)
expect(str).toContain('子字符串')
expect(array).toContain(item)
expect(array).toHaveLength(3)

// 对象
expect(obj).toHaveProperty('key')
expect(obj).toHaveProperty('nested.key', 'value')
expect(obj).toMatchObject({ subset: '属性子集' })

// 异常
expect(() => fn()).toThrow()
expect(() => fn()).toThrow('错误信息')
expect(() => fn()).toThrow(/模式/)

异步测试

// 推荐使用 async/await
it('获取数据', async () => {
  const data = await fetchData()
  expect(data).toEqual({ id: 1 })
})

// Promise 断言 —— 必须使用 await
await expect(fetchData()).resolves.toEqual({ id: 1 })
await expect(fetchData()).rejects.toThrow('错误')

// 错误示例 —— 可能导致假阳性
expect(promise).resolves.toBe(value)  // 缺少 await!

快速模拟参考

const mockFn = vi.fn()
mockFn.mockReturnValue(42)
mockFn.mockResolvedValue({ data: 'value' })

expect(mockFn).toHaveBeenCalled()
expect(mockFn).toHaveBeenCalledWith('arg1', 'arg2')
expect(mockFn).toHaveBeenCalledTimes(2)

验证门禁

在添加或修改测试时,请按以下顺序执行每一步,每步需满足通过条件:

  1. 运行测试套件 —— 从项目或工作区根目录运行 CI 使用的相同命令(查看 package.json 中的 scripts;常见为 vitest runpnpm testnpm test)。通过标准: 退出码为 0,且报告中无失败测试。
  2. 异步断言检查 —— 通过标准: 所有 expect(…).resolvesexpect(…).rejects 均以 await 开头(如 await expect(...)),详见 [异步测试](#async-testing)。若某行出现 resolvesrejects 但未加 await,则该门禁不通过。

附加文档

  • 模拟:参见 [references/mocking.md](references/mocking.md),了解模块模拟、函数监视及清理方法
  • 配置:参见 [references/config.md](references/config.md),了解 vitest.config 配置、初始化文件和覆盖率设置
  • 模式:参见 [references/patterns.md](references/patterns.md),了解定时器处理、快照测试及反模式

测试方法快速参考

方法用途
it() / test()定义测试用例
describe()分组测试
beforeEach() / afterEach()每个测试前/后执行的钩子
beforeAll() / afterAll()整个测试套件前/后执行的钩子
.skip跳过测试或测试组
.only仅运行当前测试
.todo占位测试
.concurrent并行执行

| .each([...]) | 参数化测试

A
@anderskev

已收录 7 个 Skill

相关推荐