# 进入检查功能测试方案 ## 功能概述 本测试方案覆盖从Worklist和History列表双击进入检查的功能。根据任务的曝光状态,系统会自动导航到不同的界面: - **未曝光任务**:进入检查界面(Exam) - **已曝光任务**:进入处理界面(Process) ## 核心实现逻辑 ### 业务流程 ```typescript worklistToExam(task) { 1. 调用 fetchTaskDetails(StudyID) 获取完整检查信息 2. 转换数据格式,包含所有Views(体位) 3. 判断曝光状态: - 所有体位已曝光 → 进入"处理界面"(businessFlow: 'process') - 有未曝光体位 → 进入"检查界面"(businessFlow: 'exam') 4. 更新Redux状态: - clearWorks() - 清空缓存 - addWork(updatedTask) - 保存任务 - setBusinessFlow() - 设置流程 } ``` ### 关键文件 - `src/domain/patient/worklistToExam.ts` - 核心业务逻辑 - `src/pages/patient/worklist.tsx` - Worklist页面(双击触发) - `src/pages/patient/HistoryList.tsx` - History页面(双击触发) ## 测试场景 ### 场景1:Worklist双击进入检查(未曝光) **测试文件**:`cypress/e2e/patient/worklist-enter-exam-unexposed.cy.ts` **前置条件**: - 用户已登录 - Worklist中存在未曝光任务 **测试步骤**: 1. 导航到Worklist 2. 双击第一条未曝光任务 3. 系统调用API获取任务详情 4. 系统判断为未曝光状态 5. 进入检查界面 **验证点**: - API调用验证: - `GET /dr/api/v1/auth/study/{id}` 被正确调用 - 返回数据包含未曝光的series和images - Redux状态验证: - `examWorksCache` 包含正确的任务数据 - `businessFlow` 状态为 'exam' - 界面验证: - 检查界面的主要元素可见(工具栏、内容区域等) --- ### 场景2:Worklist双击进入处理(已曝光) **测试文件**:`cypress/e2e/patient/worklist-enter-process-exposed.cy.ts` **前置条件**: - 用户已登录 - Worklist中存在已曝光任务 **测试步骤**: 1. 导航到Worklist 2. 双击第一条已曝光任务 3. 系统调用API获取任务详情 4. 系统判断为已曝光状态 5. 进入处理界面 **验证点**: - API调用验证: - `GET /dr/api/v1/auth/study/{id}` 被正确调用 - 返回数据的所有images状态为 'Exposed' - Redux状态验证: - `examWorksCache` 包含正确的任务数据 - `businessFlow` 状态为 'process' - `bodyPositionList` 已正确转换 - 界面验证: - 处理界面的主要元素可见 --- ### 场景3:History双击进入检查(未曝光) **测试文件**:`cypress/e2e/patient/history-enter-exam-unexposed.cy.ts` **前置条件**: - 用户已登录 - History中存在未曝光任务 **测试步骤**: 1. 导航到History 2. 双击第一条未曝光任务 3. 系统调用API获取任务详情 4. 系统判断为未曝光状态 5. 进入检查界面 **验证点**: - API调用验证:同场景1 - Redux状态验证:同场景1 - 界面验证:同场景1 --- ### 场景4:History双击进入处理(已曝光) **测试文件**:`cypress/e2e/patient/history-enter-process-exposed.cy.ts` **前置条件**: - 用户已登录 - History中存在已曝光任务 **测试步骤**: 1. 导航到History 2. 双击第一条已曝光任务 3. 系统调用API获取任务详情 4. 系统判断为已曝光状态 5. 进入处理界面 **验证点**: - API调用验证:同场景2 - Redux状态验证:同场景2 - 界面验证:同场景2 ## 测试数据准备 ### Mock数据需求 #### 1. 未曝光任务详情 ```typescript mockGetStudyDetailsUnexposed(studyId: string) ``` - 返回包含未曝光images的完整study信息 - `expose_status: 'Unexposed'` #### 2. 已曝光任务详情 ```typescript mockGetStudyDetailsExposed(studyId: string) ``` - 返回包含已曝光images的完整study信息 - `expose_status: 'Exposed'` - 包含图片路径信息 #### 3. Worklist数据 ```typescript mockFetchTwoWorks() ``` - 返回至少2条任务记录(已存在) #### 4. History数据 ```typescript mockFetchTwoHistoryWorks() ``` - 返回至少2条历史任务记录 ## Page Object增强 ### HistoryPage 需要添加: ```typescript findTableAndDoubleClickFirstRow() { cy.get('table').within(() => { cy.get('tbody tr[data-testid="row-0"]') .scrollIntoView() .should('be.visible') .dblclick({ force: true }); }); } ``` ### ExamPage 已有的验证方法: - `verifyExamPageLoaded()` - 验证检查界面加载 - `getToolbar()` - 获取工具栏 - `getContentArea()` - 获取内容区域 ### ProcessPage(如需要) 需要创建新的Page Object来验证处理界面元素 ## Redux状态验证模式 ### 验证examWorksCache ```typescript cy.window() .its('store') .invoke('getState') .its('examWorksCache') .its('works') .should('have.length', 1) .its(0) .should('have.property', 'StudyID'); ``` ### 验证businessFlow ```typescript cy.window() .its('store') .invoke('getState') .its('businessFlow') .its('currentFlow') .should('eq', 'exam'); // 或 'process' ``` ### 验证bodyPositionList(处理界面) ```typescript cy.window() .its('store') .invoke('getState') .its('bodyPositionList') .its('positions') .should('have.length.greaterThan', 0); ``` ## 执行顺序 1. ✅ 创建测试方案文档(本文档) 2. 创建/增强Mock handlers 3. 增强Page Objects 4. 编写测试用例代码: - `worklist-enter-exam-unexposed.cy.ts` - `worklist-enter-process-exposed.cy.ts` - `history-enter-exam-unexposed.cy.ts` - `history-enter-process-exposed.cy.ts` ## 注意事项 1. **不验证URL变化**:根据用户反馈,去掉URL验证点 2. **关注页面元素**:重点验证目标页面的关键元素可见性 3. **Redux状态**:每个场景都应验证相应的Redux状态 4. **API响应**:确保Mock返回正确的曝光状态数据 5. **等待策略**:使用`cy.wait()`等待API调用完成后再验证状态 ## 成功标准 所有4个测试场景都应: - ✅ 正确触发双击事件 - ✅ 正确调用API - ✅ 正确更新Redux状态 - ✅ 正确显示目标界面元素 - ✅ 测试稳定可重复执行