write-testslisted
Install: claude install-skill hacxy/skills
## 定位
```
write-prd → write-tdd → scaffold-project → [write-tests] → dev → code-review → test → deploy
```
write-tests 的职责是把 TDD 中的接口设计和模块划分转化为测试代码,形成「红-绿-重构」
循环的**红阶段**——测试先行,dev 阶段让它们变绿。
## 第一步:获取上下文
按优先级读取:
1. `docs/tdd-*.md` — 提取:API 接口列表、数据库表、模块划分
2. `docs/prd-*.md` — 提取:MVP 功能范围和用户故事(用于 E2E 场景)
3. 用户对话描述(若以上文档均不存在)
**回退策略:**
- 无 TDD → 向用户询问需要测试的接口和功能
- 无 PRD → E2E 场景由用户描述或跳过
## 第二步:生成测试用例
按三个层次逐一生成测试文件。生成顺序:**单元测试 → API 测试 → E2E 测试**。
每生成一层立即写入文件,不等全部生成完再写。
**生成完所有测试文件后,必须执行依赖声明检查:**
```bash
# 检查测试文件中所有 import 的包是否在 package.json 中声明
grep -rh "^import" tests/ | grep "from '" | grep -oP "from '[^']+'" | sort -u
cat package.json | jq '.dependencies // {} | keys'
```
API 测试必须使用 `@elysiajs/eden`,若 `package.json` 中无此包,立即安装:
```bash
bun add @elysiajs/eden
```
**不允许留到运行时才发现缺包。**
---
### 层一:单元测试
**目标**:覆盖工具函数、数据校验逻辑、Model 层核心方法。
文件放 `tests/unit/`,命名:`[模块名].test.ts`。
从 TDD 模块划分中识别可单元测试的部分:
- `models/` 中的数据操作方法
- `middlewares/` 中的校验逻辑
- 工具函数和纯函数
每个测试文件结构:
```ts
import { describe, it, expect, beforeEach } from 'bun:test'
describe('[模块名]', () => {
// 正常路径
it('should [预期行为] when [条件]', () => {
// arrange
// act
// assert
expect(actual).toBe(expected)
})
// 边界/异常路径
it('should throw when [异常条件]', () => {
expect(() => fn(invalidInput)).toThrow()
})
})
```
---
### 层二:API 接口测试
**目标**:覆盖 TDD 中定义的每条接口,每条接口至少三个用例:正常 + 参数缺失 + 越权(如有鉴权)。
文件放 `tests/api/`,命名:`[resource].test.ts`。
从 TDD API 列表逐一生成,使用 Elysia Eden treaty。
**路径适配:** 先确认项目结构再