---
title: 测试文档
order: 4
category: plus
---

# PisellSalesGrid 测试用例文档

## 1 测试概述

### 1.1 测试目标

验证多 Perspective 下列表与 RecordBoard 配置隔离正确；内置 **`monitor` / 非 monitor** 请求分支与 **`searchParams`、分页** 联动正确；**sessionStorage** 与 **Dayjs** 序列化可逆；**受控模式**下不发起内置请求且 **`runtimeContext.refresh`** 调用父级回调。

### 1.2 测试范围

- **纯函数**（建议抽测或原地导出便于测）：`serializeSearchParams` / `deserializeSearchParams`、`normalizeFilterForStorage`、`getStoredSearchParams` / `saveSearchParams` 行为、`mergeColumnRenderersIntoGrid`、`getCurrentPerspectiveConfig`、`getDefaultSearchParams`。
- **`serve.ts`**：`normalizeListPayload`、`formatParams`、`formatBookingParams`、`formatBookingResult`（与接口契约对齐的快照或样例输入）。
- **组件**：`PisellSalesGrid` + mock `useEngineContext` 与 `request`；Perspective 切换、`__id` 持久化、受控/非受控分支。
- **当前缺口**：`pisellSalesGrid` 目录下暂无 `*.test.tsx`，下列为**建议清单**。

### 1.3 测试方法

- 单元测试：Jest。
- Storybook：`PisellSalesGrid.stories.tsx` 已有若干场景，可作交互与视觉回归。
- 人工：真实店铺 token 下切换视角、筛选、批量操作与打印类动作。

## 2 纯函数与存储（建议单元测试）

### 2.1 `serializeSearchParams` / `deserializeSearchParams`

- [ ] 含 `dayjs()` 的对象往返后仍为 Dayjs 且值相等。
- [ ] 不含 Dayjs 的对象 JSON 等价。

### 2.2 `saveSearchParams` / `getStoredSearchParams`（可 mock sessionStorage）

- [ ] `PERSIST_FILTER_BY_DEFAULT === false` 时不写入 `filter`，读出合并默认参数后筛选项仍以默认为准。
- [ ] 非法 JSON 不抛未捕获异常（现有实现 `warn` 并返回 null）。

### 2.3 `mergeColumnRenderersIntoGrid`

- [ ] `columnRenderers` 覆盖同 `type` 列的 `render`；未匹配 `type` 的列不变。
- [ ] `columns` 非数组或无 `columnRenderers` 时原样返回。

### 2.4 `getCurrentPerspectiveConfig`

- [ ] 命中 key / 未命中回退第一项 / 空数组返回 `undefined`。

## 3 列表与接口（建议单元测试或契约测）

### 3.1 `normalizeListPayload`

- [ ] `raw.data.data.list` 与顶层 `list` 等多种嵌套归一为 `{ list, count }`。

### 3.2 `getOrderList` / `getBookingList`（mock HTTP）

- [ ] `monitor` 视角组件触发 GET booking；非 monitor 触发 POST order list。
- [ ] `extParams.list` 合并进请求体或 query（与实现一致）。

## 4 组件行为（建议 RTL + mock）

- [ ] **`key={currentPerspective}`**：切换 perspective 后 RecordBoard 子树重置（可通过 mock 子组件 render 计数或内部 state 探测）。
- [ ] **受控 `data`**：不调用 `getOrderList` / `getBookingList`（spy）。
- [ ] **`getChildComponentProps(ctx)`**：`ctx.refresh` 调用后触发对应 `run` 或父级 `onRefresh`。
- [ ] **`onSearch`**：页码重置为 1（内部非受控路径）。
- [ ] **`__id`**：`searchParams` 变更后 sessionStorage 更新。

## 5 批量操作（`useActions`）

- [ ] 成功回调触发 `onRefresh` 与 `onClearSelection`（mock）。
- [ ] 各 action 在缺少 `shopId` 等前置条件时的早退（打印类）不抛错。

## 6 回归清单（发版前人工）

- [ ] `monitor` 与订单视角默认筛选是否符合业务预期。
- [ ] 列显隐：传 `__id` 后刷新页面恢复（RecordBoard + utils）。
- [ ] 配置 `floorMap` 时工具栏出现表格/平面图切换，平面图模式无分页。
