Status: done
作为测试开发者, 我想要编写订单状态流转的 E2E 测试, 以便验证激活和关闭订单的功能。
Given 订单 CRUD 测试已通过 When 编写订单状态流转测试用例 Then 包含以下测试场景:
激活草稿订单
关闭进行中订单
状态限制验证
测试文件: web/tests/e2e/specs/admin/order-status.spec.ts
OrderManagementPage 中添加 activateOrder() 方法OrderManagementPage 中添加 closeOrder() 方法OrderManagementPage 中添加 getOrderStatus() 方法web/tests/e2e/specs/admin/order-status.spec.tsEpic 10: 订单管理 E2E 测试 (Epic C - 业务测试 Epic)
依赖:
从 Story 10.6 学到的经验:
Page Object 菜单操作模式:
灵活的选择器策略:
/^(确认删除|删除|确定|确认)$/ 匹配确认按钮测试隔离优化:
Toast 消息验证:
/删除/ 匹配删除相关的成功消息订单状态常量定义 (web/tests/e2e/pages/admin/order-management.page.ts):
// 订单状态常量
export const ORDER_STATUS = {
DRAFT: 'draft',
CONFIRMED: 'confirmed',
IN_PROGRESS: 'in_progress',
COMPLETED: 'completed',
} as const;
export type OrderStatus = typeof ORDER_STATUS[keyof typeof ORDER_STATUS];
// 订单状态显示名称映射
export const ORDER_STATUS_LABELS: Record<OrderStatus, string> = {
draft: '草稿',
confirmed: '已确认',
in_progress: '进行中',
completed: '已完成',
} as const;
已有的相关方法:
| 方法 | 说明 | 状态流转测试用途 |
|---|---|---|
createOrder(data) |
创建订单 | 创建草稿订单作为测试起点 |
editOrder(orderName, data) |
编辑订单 | 可通过 status 字段修改状态(但不是真实的状态流转操作) |
openDetailDialog(orderName) |
打开订单详情 | 验证详情中的状态显示 |
getOrderDetailInfo() |
获取订单详情 | 获取当前订单状态信息 |
openEditDialog(orderName) |
打开编辑菜单 | 参考菜单操作模式 |
状态流转操作方法(需要添加):
激活订单方法:
/**
* 打开激活订单确认对话框
* @param orderName 订单名称
*/
async openActivateDialog(orderName: string): Promise<void>
/**
* 确认激活订单
*/
async confirmActivate(): Promise<void>
/**
* 激活订单(完整流程)
* @param orderName 订单名称
* @returns 是否成功激活
*/
async activateOrder(orderName: string): Promise<boolean>
关闭订单方法:
/**
* 打开关闭订单确认对话框
* @param orderName 订单名称
*/
async openCloseDialog(orderName: string): Promise<void>
/**
* 确认关闭订单
*/
async confirmClose(): Promise<void>
/**
* 关闭订单(完整流程)
* @param orderName 订单名称
* @returns 是否成功关闭
*/
async closeOrder(orderName: string): Promise<boolean>
状态获取方法:
/**
* 获取订单的当前状态(从列表页面)
* @param orderName 订单名称
* @returns 订单状态值
*/
async getOrderStatus(orderName: string): Promise<OrderStatus | null>
/**
* 验证订单状态
* @param orderName 订单名称
* @param expectedStatus 期望的状态
*/
async expectOrderStatus(orderName: string, expectedStatus: OrderStatus): Promise<void>
按钮状态验证方法:
/**
* 检查激活按钮是否可用
* @param orderName 订单名称
* @returns 按钮是否可用
*/
async isActivateButtonEnabled(orderName: string): Promise<boolean>
/**
* 检查关闭按钮是否可用
* @param orderName 订单名称
* @returns 按钮是否可用
*/
async isCloseButtonEnabled(orderName: string): Promise<boolean>
激活草稿订单:
关闭进行中订单:
状态限制验证:
状态流转图参考:
草稿 (draft) --[激活]--> 进行中 (in_progress) --[关闭]--> 已完成 (completed)
↑
[确认] (从草稿)
状态流转按钮位置假设(需要验证):
在操作菜单中(与编辑/删除类似):
作为行操作按钮:
在详情页面中:
测试时优先探索的顺序:
遵循 Epic 9.6 并行执行决策:
test.describe.serial遵循项目的类型规范:
ORDER_STATUS 和 ORDER_STATUS_LABELS 常量OrderStatus 类型别名遵循项目的测试模式:
data-sonner-toast 选择器role="dialog" 或 role="alertdialog"测试文件位置:
web/tests/e2e/
├── pages/admin/
│ └── order-management.page.ts (需要补充状态流转方法)
└── specs/admin/
└── order-status.spec.ts (新建)
与其他测试的关系:
order-list.spec.ts: 验证列表中状态徽章显示order-create.spec.ts: 创建草稿订单(测试起点)order-edit.spec.ts: 编辑订单(可能涉及状态修改)order-delete.spec.ts: 删除订单(参考菜单操作模式)潜在冲突:
状态流转测试_${timestamp}Epic 需求来源:
Page Object 现有实现:
前序 Story 学习:
项目上下文:
claude-opus-4-5-20251101
无
Page Object 状态流转方法补充 (web/tests/e2e/pages/admin/order-management.page.ts):
openActivateDialog() - 打开激活订单确认对话框confirmActivate() - 确认激活订单activateOrder() - 激活订单(完整流程)openCloseDialog() - 打开关闭订单确认对话框confirmClose() - 确认关闭订单closeOrder() - 关闭订单(完整流程)getOrderStatus() - 获取订单的当前状态expectOrderStatus() - 验证订单状态checkActivateButtonEnabled() - 检查激活按钮是否可用checkCloseButtonEnabled() - 检查关闭按钮是否可用测试文件创建 (web/tests/e2e/specs/admin/order-status.spec.ts):
代码审查修复 (2026-01-12):
getOrderStatus() 方法,跳过第一列避免匹配订单名称,增加状态徽章查找策略isActivateButtonEnabled() → checkActivateButtonEnabled(),isCloseButtonEnabled() → checkCloseButtonEnabled(),明确表示有副作用getFirstOrderName() 辅助函数/激活.*成功|已激活/ 和 /关闭.*成功|已完成/新增文件:
web/tests/e2e/specs/admin/order-status.spec.ts - 订单状态流转测试文件修改文件:
web/tests/e2e/pages/admin/order-management.page.ts - 添加了10个状态流转相关方法2026-01-12