Jelajahi Sumber

📝 docs(stories): 新增残疾人管理集成测试故事文档

- 创建故事010.007文档,描述完善残疾人管理新增/编辑功能集成测试的需求
- 包含验收标准、任务分解、开发说明和API端点参考
- 基于测试策略文档,强调使用真实组件和完整模拟数据的原则
- 提供数据模型和组件集成参考,支持后续测试开发工作
yourname 1 Minggu lalu
induk
melakukan
2eb8a21ceb
1 mengubah file dengan 135 tambahan dan 0 penghapusan
  1. 135 0
      docs/stories/010.007.story.md

+ 135 - 0
docs/stories/010.007.story.md

@@ -0,0 +1,135 @@
+# Story 010.007: 完善残疾人管理新增/编辑功能集成测试
+
+## Status
+Draft
+
+## Story
+**As a** 测试工程师
+**I want** 残疾人管理的新增和编辑功能的集成测试能够覆盖完整流程
+**so that** 确保相关功能的质量和稳定性
+
+## Acceptance Criteria
+1. 集成测试使用真实的组件,只mock API调用
+2. 测试覆盖完整的新增残疾人流程,包括照片、银行卡、备注、回访等子组件
+3. 测试覆盖完整的编辑残疾人流程,包括聚合数据的加载和更新
+4. 测试覆盖表单验证错误场景(必填字段为空、格式错误等)
+5. 测试覆盖API错误处理场景(400、500错误等)
+6. 修复现有测试中mock API与实际API不匹配的问题(createAggregatedDisabledPerson vs createDisabledPerson)
+7. 所有集成测试通过,无console.debug调试输出残留
+
+## Tasks / Subtasks
+- [ ] 修复API mock与实际API不匹配问题 (AC: 6)
+  - [ ] 分析当前测试文件中的API mock:`allin-packages/disability-person-management-ui/tests/integration/disability-person.integration.test.tsx`
+  - [ ] 检查实际后端路由使用的聚合API名称:`createAggregatedDisabledPerson`和`updateAggregatedDisabledPerson`
+  - [ ] 更新测试mock以匹配实际使用的聚合API端点
+  - [ ] 验证mock响应数据结构与实际API响应格式一致
+- [ ] 添加完整的表单验证测试 (AC: 4)
+  - [ ] 测试必填字段为空时的验证错误显示:姓名、身份证号、残疾证号、联系电话、身份证地址
+  - [ ] 测试字段格式错误场景:身份证号格式、手机号格式、邮箱格式(如适用)
+  - [ ] 测试字段长度限制验证:超长字段应显示适当错误信息
+  - [ ] 测试区域选择器验证:省份、城市、区县选择验证
+- [ ] 添加API错误处理测试 (AC: 5)
+  - [ ] 测试API返回400错误时的错误处理(如身份证号重复、数据验证失败)
+  - [ ] 测试API返回500错误时的错误处理(服务器内部错误)
+  - [ ] 测试网络错误场景(请求失败、超时等)
+  - [ ] 验证错误信息在界面上正确显示给用户
+- [ ] 添加子组件集成测试 (AC: 2, 3)
+  - [ ] 测试照片上传子组件:添加照片、移除照片、照片类型选择
+  - [ ] 测试银行卡管理子组件:添加银行卡、编辑银行卡、删除银行卡
+  - [ ] 测试备注管理子组件:添加备注、查看备注、删除备注
+  - [ ] 测试回访记录子组件:添加回访记录、编辑回访记录
+  - [ ] 测试编辑模式下的聚合数据加载:验证所有子组件数据正确加载
+- [ ] 完善新增和编辑流程测试 (AC: 1, 2, 3)
+  - [ ] 测试完整的新增残疾人流程:打开表单→填写信息→添加照片/银行卡/备注/回访→提交→验证成功
+  - [ ] 测试完整的编辑残疾人流程:打开编辑→加载聚合数据→修改信息→更新子组件数据→提交→验证成功
+  - [ ] 使用真实组件而非模拟组件,只mock网络请求
+  - [ ] 验证组件间状态同步和数据传递正确性
+- [ ] 清理调试信息和验证测试通过 (AC: 7)
+  - [ ] 移除所有不必要的console.debug和console.log输出
+  - [ ] 运行所有集成测试,确保全部通过
+  - [ ] 验证测试覆盖率满足要求(集成测试 ≥ 60%)
+  - [ ] 检查测试代码符合编码标准和测试策略
+
+## Dev Notes
+
+### 测试文件位置
+- **测试文件**: `allin-packages/disability-person-management-ui/tests/integration/disability-person.integration.test.tsx` [Source: docs/prd/epic-010-system-bug-fixes.md#技术说明]
+- **项目结构**: UI包位于`allin-packages/`目录下,测试文件与源码并列在`tests/`目录中 [Source: architecture/source-tree.md#集成指南]
+
+### 测试策略和标准
+- **测试框架**: Vitest + Testing Library + hono/testing [Source: architecture/tech-stack.md#新技术添加]
+- **测试类型**: 集成测试,验证多个组件/服务协作 [Source: architecture/testing-strategy.md#集成测试-(Integration-Tests)]
+- **覆盖率目标**: 集成测试 ≥ 60% [Source: architecture/testing-strategy.md#各层覆盖率要求]
+- **测试执行**: 每次API变更执行集成测试 [Source: architecture/testing-strategy.md#集成测试-(Integration-Tests)]
+
+### 测试用例编写规范
+基于架构文档中的测试用例编写规范,必须遵循以下原则:
+
+1. **使用真实组件而非模拟组件**:集成测试应尽可能使用真实的组件,而不是过度简化的模拟组件 [Source: architecture/testing-strategy.md#1-使用真实组件而非模拟组件]
+2. **理解组件的工作模式**:测试前必须理解真实组件的工作模式(单选/多选、交互方式等) [Source: architecture/testing-strategy.md#2-理解组件的工作模式]
+3. **提供完整的模拟数据**:模拟数据应包含真实组件需要的所有字段,避免因字段缺失导致测试失败 [Source: architecture/testing-strategy.md#3-提供完整的模拟数据]
+4. **使用适当的测试选择器**:优先使用语义化的选择器(role、label),其次使用test-id,避免使用不稳定的选择器 [Source: architecture/testing-strategy.md#4-使用适当的测试选择器]
+5. **处理异步加载和状态变化**:集成测试需要正确处理组件的异步加载和状态变化 [Source: architecture/testing-strategy.md#5-处理异步加载和状态变化]
+6. **验证完整的用户流程**:集成测试应验证完整的用户流程,而不仅仅是单个操作 [Source: architecture/testing-strategy.md#6-验证完整的用户流程]
+7. **使用共享测试工具处理复杂组件**:对于复杂的UI组件,应使用共享UI包中的测试工具函数 [Source: architecture/testing-strategy.md#7-使用共享测试工具处理复杂组件]
+8. **清理调试信息**:提交代码前应移除不必要的调试信息(console.log、console.debug) [Source: architecture/testing-strategy.md#8-清理调试信息]
+
+### API端点参考
+根据残疾人管理模块移植故事,实际使用的API端点包括:
+
+- **聚合创建API**: `POST /disability-persons/aggregated/create` - 创建聚合残疾人信息 [Source: docs/stories/007.004.transplant-disability-management-module.story.md#API端点]
+- **聚合查询API**: `GET /disability-persons/aggregated/:personId` - 查询聚合残疾人信息 [Source: docs/stories/007.004.transplant-disability-management-module.story.md#API端点]
+- **标准CRUD API**:
+  - `POST /disability-persons` - 创建残疾人基本信息
+  - `GET /disability-persons/:id` - 根据ID获取残疾人信息
+  - `GET /disability-persons` - 获取所有残疾人信息(分页+条件查询)
+  - `PUT /disability-persons/:id` - 更新残疾人信息
+  - `DELETE /disability-persons/:id` - 删除残疾人信息
+
+**注意**: 当前测试文件mock了`createDisabledPerson`和`updateDisabledPerson`,但实际UI组件可能使用聚合API `createAggregatedDisabledPerson`和`updateAggregatedDisabledPerson`,需要检查并修正。
+
+### 数据模型参考
+残疾人管理涉及多个关联实体:
+- `DisabledPerson` - 残疾人基本信息
+- `DisabledBankCard` - 银行卡信息
+- `DisabledPhoto` - 照片信息(通过`fileId`引用`File`实体)
+- `DisabledRemark` - 备注信息
+- `DisabledVisit` - 回访记录信息
+
+聚合API返回包含所有关联数据的完整结构。
+
+### 组件集成参考
+- **文件上传**: 集成`@d8d/file-management-ui`的`FileSelector`组件
+- **区域选择器**: 集成`@d8d/area-management-ui`的区域选择器组件(省份→城市→区县三级联动)
+- **枚举常量**: 使用`@d8d/allin-enums`包中的残疾类型、残疾等级等枚举
+
+### 前一个故事经验
+故事010.006(修复省信息编辑功能)的经验:
+- 修复了`parentId`转换错误(`null || 0`导致验证失败)
+- 修复了硬编码日期值问题
+- 运行了类型检查和测试验证修复结果
+
+这些经验表明在修复测试时需要注意数据转换和实际值使用。
+
+## Change Log
+| Date | Version | Description | Author |
+|------|---------|-------------|--------|
+| 2025-12-12 | 1.0 | 故事创建,基于史诗010-07需求 | Bob (Scrum Master) |
+
+## Dev Agent Record
+*This section will be populated by the development agent during implementation*
+
+### Agent Model Used
+*This section will be populated by the development agent during implementation*
+
+### Debug Log References
+*This section will be populated by the development agent during implementation*
+
+### Completion Notes List
+*This section will be populated by the development agent during implementation*
+
+### File List
+*This section will be populated by the development agent during implementation*
+
+## QA Results
+*This section will be populated by the QA agent during review*