|
@@ -0,0 +1,162 @@
|
|
|
|
|
+# Story 006.019: 批量创建组件测试修复与API模拟规范化
|
|
|
|
|
+
|
|
|
|
|
+## Status
|
|
|
|
|
+Ready for Development
|
|
|
|
|
+
|
|
|
|
|
+## Story
|
|
|
|
|
+**As a** 开发人员,
|
|
|
|
|
+**I want** 修复BatchSpecCreatorInline组件的5个测试失败,并更新BatchSpecCreator组件的API模拟规范,
|
|
|
|
|
+**so that** 所有测试通过,表单验证逻辑正确触发toast错误提示,API模拟符合统一规范
|
|
|
|
|
+
|
|
|
|
|
+## Acceptance Criteria
|
|
|
|
|
+1. BatchSpecCreatorInline组件所有23个测试通过(当前18/23通过,5个失败)
|
|
|
|
|
+2. BatchSpecCreator组件测试符合API模拟规范
|
|
|
|
|
+3. 表单验证错误正确触发toast错误提示
|
|
|
|
|
+4. API模拟使用统一的rpcClient模拟,符合API模拟规范
|
|
|
|
|
+5. 测试环境配置正确,无Mock配置不完整或过时问题
|
|
|
|
|
+6. 表单验证逻辑与组件实际行为一致
|
|
|
|
|
+
|
|
|
|
|
+## Tasks / Subtasks
|
|
|
|
|
+- [ ] **分析BatchSpecCreatorInline测试失败原因** (AC: 1, 3, 6)
|
|
|
|
|
+ - [ ] 运行BatchSpecCreatorInline测试套件,识别5个失败的测试
|
|
|
|
|
+ - [ ] 分析表单验证和toast错误消息测试失败的具体原因
|
|
|
|
|
+ - [ ] 检查React Hook Form验证错误结构、toast模拟配置、表单提交流程问题
|
|
|
|
|
+
|
|
|
|
|
+- [ ] **修复表单验证测试** (AC: 1, 3, 6)
|
|
|
|
|
+ - [ ] 修复"应该验证价格不能为负数"测试(toast.error未调用)
|
|
|
|
|
+ - [ ] 修复"应该验证成本价不能为负数"测试(toast.error未调用)
|
|
|
|
|
+ - [ ] 修复"应该验证库存不能为负数"测试(toast.error未调用)
|
|
|
|
|
+ - [ ] 修复"应该验证多个错误字段"测试(toast.error未调用)
|
|
|
|
|
+ - [ ] 修复"应该测试完整的用户交互流程"测试(规格名称更新问题)
|
|
|
|
|
+
|
|
|
|
|
+- [ ] **更新BatchSpecCreator组件API模拟规范** (AC: 2, 4, 5)
|
|
|
|
|
+ - [ ] 分析BatchSpecCreator.test.tsx当前API模拟实现
|
|
|
|
|
+ - [ ] 按照API模拟规范重构,使用统一的rpcClient模拟
|
|
|
|
|
+ - [ ] 移除直接模拟goodsClientManager的残余代码
|
|
|
|
|
+ - [ ] 确保模拟响应结构与实际API响应一致
|
|
|
|
|
+
|
|
|
|
|
+- [ ] **验证API模拟规范一致性** (AC: 2, 4, 5)
|
|
|
|
|
+ - [ ] 确保两个组件测试都使用统一的rpcClient模拟
|
|
|
|
|
+ - [ ] 验证模拟响应结构与实际API响应一致
|
|
|
|
|
+ - [ ] 修复任何残留的直接模拟goodsClientManager的代码
|
|
|
|
|
+
|
|
|
|
|
+- [ ] **运行完整测试验证** (AC: 1, 2, 3, 4, 5, 6)
|
|
|
|
|
+ - [ ] 运行BatchSpecCreatorInline所有23个测试,验证全部通过
|
|
|
|
|
+ - [ ] 运行BatchSpecCreator组件测试,验证API模拟规范符合要求
|
|
|
|
|
+ - [ ] 运行父子商品管理相关组件的完整测试套件
|
|
|
|
|
+ - [ ] 验证测试覆盖率保持或提高
|
|
|
|
|
+
|
|
|
|
|
+## Dev Notes
|
|
|
|
|
+
|
|
|
|
|
+### 技术栈信息 [Source: architecture/tech-stack.md]
|
|
|
|
|
+- **运行时**: Node.js 20.18.3
|
|
|
|
|
+- **框架**: Hono 4.8.5 (Web框架和API路由,RPC类型安全)
|
|
|
|
|
+- **前端框架**: React 19.1.0 (用户界面构建)
|
|
|
|
|
+- **数据库**: PostgreSQL 17 (通过TypeORM进行数据持久化存储)
|
|
|
|
|
+- **ORM**: TypeORM 0.3.25 (数据库操作抽象,实体管理)
|
|
|
|
|
+- **样式**: Tailwind CSS 4.1.11 (原子化CSS框架)
|
|
|
|
|
+- **状态管理**: React Query 5.83.0 (服务端状态管理)
|
|
|
|
|
+- **测试框架**: Vitest 2.x (单元测试框架,更好的TypeORM支持)
|
|
|
|
|
+- **API测试**: hono/testing (内置,API端点测试,更好的类型安全)
|
|
|
|
|
+
|
|
|
|
|
+### 项目结构信息 [Source: architecture/source-tree.md]
|
|
|
|
|
+- **包管理**: 使用pnpm workspace管理多包依赖关系
|
|
|
|
|
+- **多租户架构**: 所有操作必须包含tenantId过滤,父子商品必须在同一租户下
|
|
|
|
|
+- **商品管理UI包**: `packages/goods-management-ui-mt/` (`@d8d/goods-management-ui-mt`)
|
|
|
|
|
+- **主要组件**:
|
|
|
|
|
+ - `src/components/BatchSpecCreatorInline.tsx`
|
|
|
|
|
+ - `src/components/BatchSpecCreator.tsx`
|
|
|
|
|
+- **API客户端**: `packages/goods-management-ui-mt/src/api/goodsClient.ts`
|
|
|
|
|
+- **共享UI组件**: `@d8d/shared-ui-components` (shadcn/ui组件库,46+基础组件)
|
|
|
|
|
+- **测试目录**: `packages/goods-management-ui-mt/tests/unit/`
|
|
|
|
|
+
|
|
|
|
|
+### API模拟规范要求 [Source: architecture/testing-strategy.md#API模拟规范]
|
|
|
|
|
+- **统一模拟点**: 必须统一模拟`@d8d/shared-ui-components/utils/hc`中的`rpcClient`函数,而不是分别模拟各个客户端管理器
|
|
|
|
|
+- **模拟优势**: 统一控制所有API调用,简化配置,天然支持跨UI包集成测试,维护性高
|
|
|
|
|
+- **模拟策略**:
|
|
|
|
|
+ 1. 在测试文件顶部使用`vi.mock`统一模拟`rpcClient`函数
|
|
|
|
|
+ 2. 创建模拟的`rpcClient`函数,返回包含`$get`、`$post`、`$put`、`$delete`方法的模拟对象
|
|
|
|
|
+ 3. 使用`createMockResponse`辅助函数生成一致的API响应格式
|
|
|
|
|
+ 4. 在测试用例的`beforeEach`或具体测试中配置模拟响应
|
|
|
|
|
+- **响应格式要求**: 模拟完整的Response对象,包含`status`、`ok`、`json()`等方法,确保与实际API响应结构一致
|
|
|
|
|
+- **跨包支持**: 统一模拟天然支持多个UI包组件的API模拟,无需分别模拟客户端管理器
|
|
|
|
|
+
|
|
|
|
|
+### 组件模拟策略要求
|
|
|
|
|
+- **第三方库模拟**:
|
|
|
|
|
+ - **必须使用真实实现**: `@tanstack/react-query`(React Query库),组件测试应使用真实的QueryClient和useQueryClient,确保状态管理逻辑正确
|
|
|
|
|
+ - **允许模拟**: `sonner`(Toast通知库)、`lucide-react`(图标库)等UI库,可使用最小化模拟
|
|
|
|
|
+- **子组件模拟**: 严格禁止模拟项目内部的子组件,必须使用实际组件进行集成测试
|
|
|
|
|
+- **API客户端模拟**: 必须统一模拟`@d8d/shared-ui-components/utils/hc`中的`rpcClient`函数,而不是分别模拟各个客户端管理器
|
|
|
|
|
+
|
|
|
|
|
+### 测试失败分析(基于故事006.016)
|
|
|
|
|
+根据故事006.016的记录,BatchSpecCreatorInline当前状态:23个测试中18个通过,5个失败。失败的测试包括:
|
|
|
|
|
+1. 应该验证价格不能为负数(toast.error未调用)
|
|
|
|
|
+2. 应该验证成本价不能为负数(toast.error未调用)
|
|
|
|
|
+3. 应该验证库存不能为负数(toast.error未调用)
|
|
|
|
|
+4. 应该验证多个错误字段(toast.error未调用)
|
|
|
|
|
+5. 应该测试完整的用户交互流程(规格名称更新问题)
|
|
|
|
|
+
|
|
|
|
|
+**问题分析**: 表单验证错误似乎没有正确触发toast.error调用,可能原因包括:
|
|
|
|
|
+- React Hook Form验证错误结构问题
|
|
|
|
|
+- toast模拟配置问题
|
|
|
|
|
+- 表单提交流程问题
|
|
|
|
|
+- 组件状态管理问题
|
|
|
|
|
+
|
|
|
|
|
+### 技术约束
|
|
|
|
|
+- **租户隔离**: 所有查询必须包含tenantId过滤,测试模拟响应必须包含租户相关字段
|
|
|
|
|
+- **API兼容性**: 保持现有API行为不变,模拟响应必须与实际API响应结构一致
|
|
|
|
|
+- **类型安全**: 使用TypeScript确保模拟响应与API类型兼容
|
|
|
|
|
+- **可维护性**: 保持模拟响应与实际API响应结构一致,便于后续更新
|
|
|
|
|
+
|
|
|
|
|
+### 文件变更
|
|
|
|
|
+**待修改文件**:
|
|
|
|
|
+1. `packages/goods-management-ui-mt/tests/unit/BatchSpecCreatorInline.test.tsx` - 修复表单验证测试
|
|
|
|
|
+2. `packages/goods-management-ui-mt/tests/unit/BatchSpecCreator.test.tsx` - 更新API模拟规范
|
|
|
|
|
+
|
|
|
|
|
+**验证文件**:
|
|
|
|
|
+1. `packages/goods-management-ui-mt/src/components/BatchSpecCreatorInline.tsx` - 组件源码
|
|
|
|
|
+2. `packages/goods-management-ui-mt/src/components/BatchSpecCreator.tsx` - 组件源码
|
|
|
|
|
+
|
|
|
|
|
+## Testing
|
|
|
|
|
+### 测试标准 [Source: architecture/testing-strategy.md]
|
|
|
|
|
+- **测试文件位置**: `packages/goods-management-ui-mt/tests/unit/`目录下
|
|
|
|
|
+- **单元测试位置**: `tests/unit/**/*.test.{ts,tsx}`
|
|
|
|
|
+- **测试框架**: Vitest + Testing Library + hono/testing + shared-test-util
|
|
|
|
|
+- **测试要求**: 所有测试必须符合API模拟规范,使用统一的`rpcClient`模拟
|
|
|
|
|
+- **测试模式**: 使用测试数据工厂模式,避免硬编码测试数据
|
|
|
|
|
+
|
|
|
|
|
+### 测试策略要求
|
|
|
|
|
+- **单元测试**: 验证单个组件的正确性,必须覆盖所有交互和状态变化
|
|
|
|
|
+- **表单验证测试**: 必须测试各种验证场景(正数、负数、零、空值等)
|
|
|
|
|
+- **错误测试**: 必须测试各种错误场景(网络错误、验证错误、服务器错误等)
|
|
|
|
|
+- **覆盖率要求**: 测试覆盖率不应低于现有水平,关键组件应达到80%+覆盖率
|
|
|
|
|
+- **验证标准**: 所有测试必须通过,无flaky tests,测试执行稳定可靠
|
|
|
|
|
+
|
|
|
|
|
+### 测试验证步骤
|
|
|
|
|
+1. **运行单个组件测试**: 验证修复后的测试通过率
|
|
|
|
|
+2. **运行完整测试套件**: 验证所有相关组件测试通过
|
|
|
|
|
+3. **检查覆盖率报告**: 确保测试覆盖率保持或提高
|
|
|
|
|
+4. **运行多次测试**: 验证测试稳定性,无随机失败
|
|
|
|
|
+
|
|
|
|
|
+## Change Log
|
|
|
|
|
+| Date | Version | Description | Author |
|
|
|
|
|
+|------|---------|-------------|--------|
|
|
|
|
|
+| 2025-12-15 | 1.0 | 初始故事创建,从故事006.016拆分 | John (Product Manager) |
|
|
|
|
|
+
|
|
|
|
|
+## Dev Agent Record
|
|
|
|
|
+*此部分由开发代理在实现过程中填写*
|
|
|
|
|
+
|
|
|
|
|
+### Agent Model Used
|
|
|
|
|
+Claude Sonnet
|
|
|
|
|
+
|
|
|
|
|
+### Debug Log References
|
|
|
|
|
+无
|
|
|
|
|
+
|
|
|
|
|
+### Completion Notes List
|
|
|
|
|
+*待开发代理填写*
|
|
|
|
|
+
|
|
|
|
|
+### File List
|
|
|
|
|
+*待开发代理填写*
|
|
|
|
|
+
|
|
|
|
|
+## QA Results
|
|
|
|
|
+*此部分由QA代理在审查完成后填写*
|