Status: ready-for-dev
作为测试开发者, 我想要编写删除订单的 E2E 测试, 以便验证订单删除功能和相关约束。
Given 编辑订单测试已通过 When 编写删除订单测试用例 Then 包含以下测试场景:
删除草稿状态订单
删除有关联人员的订单
取消删除
测试文件: web/tests/e2e/specs/admin/order-delete.spec.ts
web/tests/e2e/specs/admin/order-delete.spec.tsEpic 10: 订单管理 E2E 测试 (Epic C - 业务测试 Epic)
依赖:
Page Object 已有的删除功能:
web/tests/e2e/pages/admin/order-management.page.ts 包含以下删除相关方法:
打开删除确认对话框:
async openDeleteDialog(orderName: string): Promise<void>
role="alertdialog")确认删除:
async confirmDelete(): Promise<void>
取消删除:
async cancelDelete(): Promise<void>
删除订单完整流程:
async deleteOrder(orderName: string): Promise<boolean>
验证订单存在:
async orderExists(orderName: string): Promise<boolean>
创建订单:
async createOrder(data: OrderData): Promise<FormSubmitResult>
创建测试订单: 删除测试需要先有可删除的订单。参考 Story 10.3、10.4、10.5 的测试数据策略:
// 使用时间戳创建唯一订单名称
const timestamp = Date.now();
const testOrderName = `删除测试订单_${timestamp}`;
// 先创建订单
await orderManagementPage.createOrder({
name: testOrderName,
expectedStartDate: '2025-01-15',
});
创建有关联人员的订单(测试场景 2):
// 创建订单并添加人员
await orderManagementPage.createOrder({
name: testOrderName,
expectedStartDate: '2025-01-15',
});
// 打开人员管理对话框
await orderManagementPage.openPersonManagementDialog(testOrderName);
// 添加人员
await orderManagementPage.addPersonToOrder({
disabledPersonName: '测试人员',
hireDate: '2025-01-20',
salary: 5000,
});
参考 Story 10.4(创建订单测试)和 Story 10.5(编辑订单测试)的测试结构:
import { test, expect } from '../../utils/test-setup';
import { OrderManagementPage } from '../../pages/admin/order-management.page';
import { ORDER_STATUS } from '../../pages/admin/order-management.page';
test.describe.serial('删除订单测试', () => {
let testOrderName: string;
test.beforeEach(async ({ adminLoginPage, orderManagementPage }) => {
await adminLoginPage.goto();
await adminLoginPage.login('admin', 'admin123');
await orderManagementPage.goto();
// 创建测试订单
const timestamp = Date.now();
testOrderName = `删除测试_${timestamp}`;
await orderManagementPage.createOrder({
name: testOrderName,
expectedStartDate: '2025-01-15',
});
});
test.describe('删除草稿状态订单', () => {
test('应该成功删除草稿订单', async ({ orderManagementPage }) => {
// 打开删除确认对话框
await orderManagementPage.openDeleteDialog(testOrderName);
// 确认删除
await orderManagementPage.confirmDelete();
// 验证订单不再存在
expect(await orderManagementPage.orderExists(testOrderName)).toBe(false);
});
test('应该在删除后显示成功提示', async ({ orderManagementPage }) => {
await orderManagementPage.deleteOrder(testOrderName);
// 验证 Toast 成功消息
const successToast = orderManagementPage.page.locator('[data-sonner-toast][data-type="success"]');
await expect(successToast).toBeVisible();
});
});
test.describe('取消删除', () => {
test('应该能在确认对话框中取消删除', async ({ orderManagementPage }) => {
// 打开删除确认对话框
await orderManagementPage.openDeleteDialog(testOrderName);
// 取消删除
await orderManagementPage.cancelDelete();
// 验证订单仍然存在
expect(await orderManagementPage.orderExists(testOrderName)).toBe(true);
});
});
});
导入依赖:
import { test, expect } from '../../utils/test-setup';
import { OrderManagementPage, ORDER_STATUS } from '../../pages/admin/order-management.page';
测试 Fixtures:
adminLoginPage fixture 进行登录orderManagementPage fixture 操作页面test.describe.serial() 确保测试按顺序执行断言策略:
删除订单的业务规则(需要验证):
草稿状态订单:
有关联人员的订单:
删除确认对话框:
role="alertdialog" 定位遵循以下测试标准文档:
docs/standards/testing-standards.md - 测试规范docs/standards/web-ui-testing-standards.md - Web UI 测试规范docs/standards/e2e-radix-testing.md - Radix UI E2E 测试标准选择器优先级:
data-testid - 最高优先级aria-label + roletext content + role - 兜底文件位置:
web/tests/e2e/specs/admin/order-delete.spec.tsweb/tests/e2e/pages/admin/order-management.page.tsweb/tests/e2e/fixtures/对齐统一项目结构:
project-context.md 中的 TypeScript 严格模式规则any 类型# 在 web 目录下运行单个测试文件
cd web
pnpm test:e2e:chromium order-delete
# 快速失败模式(推荐调试时使用)
timeout 60 pnpm test:e2e:chromium order-delete
删除确认对话框交互:
role="alertdialog" 定位测试数据清理:
断言策略:
confirmDelete() 后列表中订单消失cancelDelete() 后订单仍然存在有关联人员订单的测试:
删除草稿状态订单:
删除有关联人员的订单:
取消删除:
边界条件测试(可选):
从 Story 10.2(订单列表测试)学到的经验:
table tbody tr 选择器定位行getByText 精确匹配getByText 精确匹配从 Story 10.3(订单筛选测试)学到的经验:
locator('label').filter({ hasText: ... }) 避免与表头冲突waitForLoadState 超时处理(可能不触发网络请求)selectRadixOption 工具选择下拉选项从 Story 10.4(创建订单测试)学到的经验:
createOrder() 方法创建测试数据从 Story 10.5(编辑订单测试)学到的关键经验:
订单操作菜单问题: 编辑按钮不是直接在表格中,而是需要先点击"打开菜单"按钮才能看到编辑选项。删除操作可能也是类似的模式。
删除按钮位置: 检查删除按钮是否也在操作菜单中,如果是,需要:
// 找到订单行并点击"打开菜单"按钮
const orderRow = this.orderTable.locator('tbody tr').filter({ hasText: orderName });
const menuButton = orderRow.getByRole('button', { name: '打开菜单' });
await menuButton.click();
// 等待菜单出现并点击"删除"选项
const deleteOption = this.page.getByRole('menuitem', { name: '删除' });
await deleteOption.click();
网络等待超时问题: waitForLoadState('networkidle') 可能超时,使用 try-catch 包裹处理。
测试数据管理: 每个测试创建独立的测试订单,避免数据冲突。
订单数据接口:
interface OrderData {
name: string;
expectedStartDate?: string;
platformId?: number;
platformName?: string;
companyId?: number;
companyName?: string;
channelId?: number;
channelName?: string;
status?: OrderStatus;
workStatus?: WorkStatus;
}
订单人员数据接口:
interface OrderPersonData {
disabledPersonId: number;
disabledPersonName?: string;
hireDate?: string;
salary?: number;
workStatus?: WorkStatus;
actualHireDate?: string;
resignDate?: string;
}
claude-opus-4-5-20251101