关于 vitest-testing
一份面向 Vitest 的测试实践技能,涵盖断言、异步测试、Mock 和测试生命周期钩子。还提供验证关卡,要求运行测试套件并检查异步匹配器是否使用 await。
主要功能
- 01提供常用断言参考
- 02说明异步测试写法
- 03介绍 vi Mock 操作
- 04汇总测试钩子与用例方法
- 05定义测试验证关卡
适用场景
- 01为 Vitest 测试编写断言
- 02测试异步函数与 Promise
- 03检查新增测试及异步匹配器
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ existential-birds/ beagle --skill vitest-testing安装后在 Claude Code 中输入/vitest-testing确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
CONFIG.mdMOCKING.mdPATTERNS.mdreferences/config.mdmocking.mdpatterns.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)
验证关卡
添加或更改测试时,请按以下顺序操作;每个步骤都有明确的通过条件。
- 运行测试套件 — 在软件包或工作区根目录运行 CI 使用的相同命令(检查
package.json脚本;通常是vitest run、pnpm test或npm test)。**通过:**退出代码为 0,且报告显示没有失败的测试。 - 异步匹配器 — **通过:**每个
expect(…).resolves和expect(…).rejects前面都带有await(await expect(...)),如异步测试中所示。任何一行出现resolves或rejects,但前面没有await,都会导致此关卡失败。
补充文档
- Mock:有关模块 Mock、监视和清理,请参阅 references/mocking.md
- 配置:有关 vitest.config、设置文件和覆盖率,请参阅 references/config.md
- 模式:有关计时器、快照和反模式,请参阅 references/patterns.md
测试方法快速参考
| 方法 | 用途 |
|---|---|
it() / test() | 定义测试 |
describe() | 对测试分组 |
beforeEach() / afterEach() | 每个测试的钩子 |
beforeAll() / afterAll() | 每个测试套件的钩子 |
.skip | 跳过测试/测试套件 |
.only | 仅运行此项 |
.todo | 占位项 |
.concurrent | 并行执行 |
.each([...]) | 参数化测试 |
评论
支持 Markdown