最后一页还有几条:用 13 条记录验收分页
用 13 条虚构 ID 和每页五条的固定快照,先列出三页完整期望,再核对末页三条、导航、空集合、非法页号及越界。附完整 Node.js 示例与 19 组实际结果,明确本地函数与界面、接口验收的边界。
执行信息
- 测试环境
- Node.js v22.22.0 / macOS / 本地固定快照分页验证
- 输入
- 请查看正文中的输入说明
- 产出
- 请查看正文中的产出说明
- 实测结果
- 请以作者提供的实测记录为准
AgentField 编辑整理:本文使用 13 条虚构 ID,演示怎样为固定快照分页先写期望、再核对结果。代码在本地 Node.js 命令行实际运行;没有连接真实业务数据,也没有验收浏览器翻页按钮、接口分页或并发增删记录。
第一页显示五条,很容易让人以为分页已经完成。问题常出现在第三页:最后三条是否还在,总页数会不会多算一页,已经到末尾却仍提供下一页。只检查“每页不超过五条”发现不了漏项;三页各取五条也可能把中间一条重复取走。
这次把验收对象缩小为一个函数:它接收同一份有序 ID 快照和页号,返回该页的完整 ID、位置、总页数与前后页信息。读者可以复制代码,把程序输出与下面事先写好的结果逐项对照。
一、先固定这 13 条属于哪一页
原始顺序是 row-01、row-02、row-03、row-04、row-05、row-06、row-07、row-08、row-09、row-10、row-11、row-12、row-13。这些 ID 没有业务含义。顺序由输入数组决定,函数不排序、不筛选,也不偷偷删除重复项。
每页固定五条,三个完整期望是:
- 第 1 页:
row-01、row-02、row-03、row-04、row-05,位置 1–5,总共 3 页;无上一页,下一页是 2。 - 第 2 页:
row-06、row-07、row-08、row-09、row-10,位置 6–10,总共 3 页;上一页是 1,下一页是 3。 - 第 3 页:
row-11、row-12、row-13,位置 11–13,总共 3 页;上一页是 2,无下一页。
把三页依次拼起来,应当与原来的 13 个 ID 完全同序,唯一 ID 数也是 13。总数相等仍不够:漏掉 row-08、重复 row-07,数量也可能不变。完整 ID 序列才是这一项的验收依据。
另外先约定两个容易含糊的情况。空快照的总记录数、总页数都是 0;为了允许首次查询,请求页号 1 返回空结果,首尾位置及前后页号都为 null,两个导航标志都为 false。其中 requestedPage: 1 只是回显请求,界面不能据此显示成“第 1 / 0 页”,应另行设计空状态。空快照请求页号 2,则报告越界。恰好 10 条时只有 2 页,第二页五条且没有下一页,不能再凭空多出一页。
二、先写输入和错误的规则
输入范围是已解析的普通 JSON 数组,元素只能是原始字符串 ID。每个 ID 长 1–16 个 ASCII 字符,首位为小写字母,后续只允许小写字母、数字和连字符;不清理空格、不改大小写,重复 ID 直接拒绝。演示不接受对象记录,不处理任意 JavaScript 代理、访问器或带副作用的输入。
页号必须是大于等于 1 的 JavaScript 安全整数。字符串 "2"、小数、0、负数、null、省略值与不安全整数都拒绝;不做强制转换,也不把非法页号纠正成第一页。Number.isSafeInteger 会检查数值类型和安全整数范围;正数要求由代码另外判断。MDN:Number.isSafeInteger