mcpField
V
vitest-testing

vitest-testing

github.com/existential-birds测试与质量85467 次安装12 周前更新
代码仓库

关于 vitest-testing

一份面向 Vitest 的测试实践技能,涵盖断言、异步测试、Mock 和测试生命周期钩子。还提供验证关卡,要求运行测试套件并检查异步匹配器是否使用 await。

主要功能

  1. 01提供常用断言参考
  2. 02说明异步测试写法
  3. 03介绍 vi Mock 操作
  4. 04汇总测试钩子与用例方法
  5. 05定义测试验证关卡

适用场景

  1. 01为 Vitest 测试编写断言
  2. 02测试异步函数与 Promise
  3. 03检查新增测试及异步匹配器

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/existential-birds/beagle --skill vitest-testing

安装后在 Claude Code 中输入/vitest-testing确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

CONFIG.md
MOCKING.md
PATTERNS.md
references/
config.md
mocking.md
patterns.md

详细介绍

Vitest 最佳实践

快速参考

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

describe('feature name', () => {
  beforeEach(() => {
    vi.clearAllMocks()
  })

  it('should do something specific', () => {
    expect(actual).toBe(expected)
  })

  it.todo('planned test')
  it.skip('temporarily disabled')
  it.only('run only this during dev')
})

常用断言

// Equality
expect(value).toBe(42)                    // Strict (===)
expect(obj).toEqual({ a: 1 })             // Deep equality
expect(obj).toStrictEqual({ a: 1 })       // Strict deep (checks types)

// Truthiness
expect(value).toBeTruthy()
expect(value).toBeFalsy()
expect(value).toBeNull()
expect(value).toBeUndefined()

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

// Strings/Arrays
expect(str).toMatch(/pattern/)
expect(str).toContain('substring')
expect(array).toContain(item)
expect(array).toHaveLength(3)

// Objects
expect(obj).toHaveProperty('key')
expect(obj).toHaveProperty('nested.key', 'value')
expect(obj).toMatchObject({ subset: 'of properties' })

// Exceptions
expect(() => fn()).toThrow()
expect(() => fn()).toThrow('error message')
expect(() => fn()).toThrow(/pattern/)

异步测试

// Async/await (preferred)
it('fetches data', async () => {
  const data = await fetchData()
  expect(data).toEqual({ id: 1 })
})

// Promise matchers - ALWAYS await these
await expect(fetchData()).resolves.toEqual({ id: 1 })
await expect(fetchData()).rejects.toThrow('Error')

// Wrong - creates false positive
expect(promise).resolves.toBe(value)  // Missing await!

快速 Mock 参考

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 脚本;通常是 vitest run、pnpm test 或 npm test)。**通过:**退出代码为 0,且报告显示没有失败的测试。
  2. 异步匹配器 — **通过:**每个 expect(…).resolves 和 expect(…).rejects 前面都带有 await(await expect(...)),如异步测试中所示。任何一行出现 resolves 或 rejects,但前面没有 await,都会导致此关卡失败。

补充文档

测试方法快速参考

方法用途
it() / test()定义测试
describe()对测试分组
beforeEach() / afterEach()每个测试的钩子
beforeAll() / afterAll()每个测试套件的钩子
.skip跳过测试/测试套件
.only仅运行此项
.todo占位项
.concurrent并行执行
.each([...])参数化测试

评论

支持 Markdown