Clawhub Publish Howto
发布技能到 ClawHub 的完整流程与常见问题排查方法。
下载 15
提供 Vitest 单元测试与集成测试的模式与最佳实践,涵盖断言、异步测试与模拟方法。
openclaw skills install @anderskev/vitest-testing命令、参数、文件名以原文为准
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)| 方法 | 用途 |
|---|---|
it() / test() | 定义测试 |
describe() | 分组测试 |
beforeEach() / afterEach() | 每个测试的钩子 |
beforeAll() / afterAll() | 整个测试套件的钩子 |
.skip | 跳过测试/套件 |
.only | 仅运行此测试 |
.todo | 占位测试 |
.concurrent | 并行执行 |
.each([...]) | 参数化测试 |
已收录 6 个 Skill