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

# PisellRecordBoard 组件测试用例文档

## 1 测试概述

### 1.1 测试目标

验证 RecordBoard **Context 注入正确**、**ShellFrame 分支与分页展示**符合预期、**列驱动 ToolBar** 与 **多选** 行为稳定；*
*平面图双视图**与 FloorMap 联调不破坏表格路径。

### 1.2 测试范围

- 容器：默认占位 context vs 打散 props 合并
- `mergeChildComponentProps` 与 `useRecordBoardContext({ displayName })` 合并
- 多选：内部 state vs `grid` 受控
- 列：有 type / 无 type、render/filter/sort 覆盖、collapseUniformColumns、uniformCompare
- 工具函数：`processColumnsForGrid`、`deriveFilterFromColumns`、`deriveSortFromColumns`、`computeUniformColumnSummary`
- ToolBar：QuickFilter 与 Filter 弹层 quickFilter 清空、filterResetKey、Segmented bodyView
- ShellFrame：`showGrid`、ScrollAreaMeasurer、`scroll.autoCalc`、平面图下无 Pagination
- 持久化：`columnVisibilityStorageKey` + `saveColumnVisibilityToLocal`（可 mock utils）

### 1.3 测试方法

- **单元测试**：工具函数纯逻辑、Hook/Context 可选（@testing-library/react）
- **Storybook**：交互与视觉回归（主文件：`PisellRecordBoard.stories.tsx`）
- **人工**：跨模块联调（RecordBoard + PisellFloorMapLayout + DataSource）

## 2 单元测试用例（建议）

### 2.1 recordBoardColumns.tsx

#### processColumnsForGrid

- [ ] `columns` 空 / undefined：不抛错，输出可预期
- [ ] 有 `type` 且无 `render`：注入只读 render
- [ ] 有 `type` 且有 `render`：保持自定义 `render`
- [ ] `getOptions` 异步：不阻塞列数组返回（若有 await 路径需单独测）

#### deriveFilterFromColumns

- [ ] `filterable === false`：不产生筛项
- [ ] 有 `type` 无 `filter`：按字段类型生成默认筛项
- [ ] 有 `type` 有 `filter`：以 `filter` 为准（quickFilter 标记）
- [ ] 无 `type`：`filter.component` 或 `filter.type` 路径
- [ ] `quickFilter: true` 的列进入 quickFilter 列表，否则进入 otherFilter

#### deriveSortFromColumns

- [ ] `sortable === false`：不产生排序项
- [ ] 有 `type` 无 `sort`：SortOptions 派生
- [ ] 无 `type`：`sort.getSortItems` 与 `sort.type` 分支

#### computeUniformColumnSummary

- [ ] 当前页同值列：返回隐藏 key 与 summaryItems
- [ ] `uniformCompare` 返回 null：该列不参与折叠
- [ ] `collapseWhenUniform === false`：强制不折叠

### 2.2 容器与 Context（PisellRecordBoard.tsx）

- [ ] 不传业务 props：`data` 为 `[]`，`onSearch`/`onPageChange` 可为默认空函数
- [ ] 传入 `data`/`pagination`/`searchParams`：原样进入 context
- [ ] 未传 `grid.selectedKeys`：内部多选 state 更新
- [ ] 传入完整 `grid.selectedKeys` + `grid.onSelectionChange`：context 为受控多选
- [ ] 移除 `floorMap`：`bodyView` 回到 `grid`（可用 act + rerender）

### 2.3 列持久化

- [ ] 给定 `columnVisibilityStorageKey`，`internalColumnVisibility` 与 localStorage 读写一致（mock `@pisell/utils`）
- [ ] `columnOrder` 拖拽后持久化（若单测 ColumnSetting 过重，可测 utils 层的 save 负载）

### 2.4 ShellFrame

- [ ] `bodyView === 'grid'`：存在 ScrollAreaMeasurer（fillHeight 时）、存在 Pagination
- [ ] `bodyView === 'floorMap'` 且存在 `floorMapProps`：渲染 PisellFloorMapLayout，**无** Pagination
- [ ] `scroll.autoCalc === true`：测量容器 `overflow: hidden`

### 2.5 ToolBar

- [ ] `floorMapProps` 存在：Segmented 出现，`setBodyView` 被调用
- [ ] `filterResetKey` 递增后 PisellFilter 的 `key` 变化（快照或 mock PisellFilter）

## 3 Storybook 覆盖矩阵

| Story                                                               | 覆盖点                                                                        |
|---------------------------------------------------------------------|----------------------------------------------------------------------------|
| **Default**                                                         | 平面图 + 表格同源数据、`onSave` / `onDataSourceRecordSave`、`dataSourceRecordForm` 切换 |
| GridLayoutWithTable                                                 | 基础表格                                                                       |
| GridLayoutWithColumnType                                            | 列 `type` 渲染                                                                |
| GridWithMultiplePages                                               | 分页                                                                         |
| GridLayoutWithCollapseUniformColumns                                | 同值列折叠                                                                      |
| GridLayoutWithUniformCompare                                        | uniformCompare                                                             |
| GridWithOnRow                                                       | onRow                                                                      |
| GridLayoutToolBarSortAndFilter                                      | 排序筛选                                                                       |
| GridLayoutWithQuickFilterOnLeft / CustomQuickFilterAndColumnsRender | 快筛                                                                         |
| CustomFilterSortRender                                              | 自定义 filter/sort/render                                                     |
| GridLayoutFull                                                      | 组合                                                                         |
| CardLayoutPlaceholder                                               | 卡片布局占位                                                                     |
| CustomComposition                                                   | 无 ShellFrame 拼装                                                            |

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

- [ ] 搜索关键字清空后再搜索：参数与列表一致
- [ ] 筛选弹层修改后：`searchParams.filter.values` 合并而非覆盖丢失其他字段
- [ ] 重置：筛选、排序清空，Filter 内表单清空（filterResetKey）
- [ ] 列设置：显隐、拖拽顺序、刷新后 localStorage 恢复
- [ ] 表格 ↔ 平面图切换：`searchParams` 不变；平面图下无分页；表格下分页可用
- [ ] 批量操作：当前页全选与列表勾选数量一致
- [ ] `scroll.autoCalc`：表头固定、表体仅内部滚动、窗口缩放后高度正确

## 5 相关文档

- [使用文档](./PisellRecordBoard.md)
- [开发文档](./PisellRecordBoard.$tab-dev.md)
- [设计文档](./PisellRecordBoard.$tab-design.md)
