mock 原理与边界(WHY_AND_HOW)
第0条(基线)本文件一切数字以 20260918 磁盘实测为准;产品源码与文档冲突时以源码为准并即时修正本文件。
第1条(被测对象)被测系统由接入系统定义:节点集合、真实代码、协议与状态机。框架不预设业务;各系统的拓扑与语义由系统级语义文档负责(注册表见 README.md 第4条)。
第2条(分布式物理定律)下列十一条定律为被测系统的工程法律,不可协商;框架设计与测试设计必须由定律推导:
| 一 | 无实时全局状态 | 信息传播需要时间,任何观测都是过去 | 禁止依赖到达顺序;必须验证任意到达顺序终态收敛 |
| 二 | 半开闭是常态 | 请求发出到响应到达之间发送方一无所知 | 必须验证操作幂等或可补偿 |
| 三 | 对等写入必发散 | 两节点对同一状态有对等写入权则冲突无终止条件 | 必须验证方向约束:只允许权威源写入 |
| 四 | 不可撤回的外部效果 | UI 渲染后只能补偿不能回滚 | 必须验证 UI 终态与服务器权威状态一致 |
| 五 | 共识是最后手段 | 能用方向约束与幂等加补偿解决则不得使用分布式事务 | 必须验证补偿路径收敛 |
| 六 | 同步共振 | N 个组件同输入同控制律则副作用 N 倍叠加 | 必须验证去重 guard 与白名单分支 |
| 七 | 单调锚点 | 幂等性的最小状态解为一个单调递增整数 | 必须验证结算 token 与阶段锚点单调 |
| 八 | 规则堆砌是模型失败 | 每次修复必须加固模型而非堆规则 | 阶段矩阵必须穷举,断言白名单分支不误伤 |
| 九 | 不对称安全 | 不可信方向保守:宁可漏判不可误判 | 攻击测试必须断言"宁可拒绝不错收" |
| 十 | 事件先于权威数据 | 状态变更通知与权威数据走不同路径,顺序不保证 | 必须验证事件 handler 在权威数据前后的行为 |
| 十一 | NULL 不可穿透 | 序列化吞掉 nil;服务器有意置空的字段不得丢失 | 快照必须预清空并用显式清理表;必须断言置 nil 字段在客户端被清空 |
第3条(设计判定)
(一)模拟边界,不模拟业务:mock 只仿真引擎对外接口,真实业务代码原样加载执行;mock 中执行的每一行产品代码即真实系统的同行代码,异常只可能为产品 BUG 或模拟失真。产品代码调用 mock 未实现的接口时,加载阶段必须失败。
(二)相对时间因果是虚拟时钟的合法性依据:控制逻辑归约为三组命题——因果序(因先于果、请求先于响应、广播先于接收、摸牌先于出牌、EndGame 先于发奖)、单调性(回合号只增不减、倒计时只减不增、结算 token 单调)、次数性(每件事恰好发生应发生的次数);三组命题在真实时钟与虚拟时钟下同真同假,故单一确定性虚拟时钟可完整覆盖控制逻辑验证。
(三)断言测三件事:未发生(断言 0 次,功能缺失)、做少了(次数或字段不足)、做多了(次数超限,非幂等或去重失效)。断言必须按 PRD 写;代码达不到 PRD 是 BUG,超出 PRD 同样是 BUG。
(四)保证分三层,不得混淆:可编译(全部被测代码成功加载)、可运行(被驱动路径实际执行且不崩溃)、行为由断言裁决(能跑不等于正确)。失败归因顺序:测试目标与 PRD 不符、输入违反产品契约、框架缺口(记 [MOCK-GAP])。判定产品 BUG 的硬标准为真实代码在 mock 中执行并产生违反文档语义的可观察结果,且附文件符号证据。
第4条(能力边界)
(一)不可测项及物理根源:真实网络协议字节(无真实 socket、序列化、重传)、渲染像素(无真实渲染与布局)、数据库磁盘崩溃恢复(无真实 DB)、性能与规模(单进程仿真)。边界以内的引擎、网络、DB 行为是 mock 的假设,不是被测对象。
(二)时序失真:mock 为单进程单线程同步分派,真实异步间隙被消除,去重窗口在同步分派下折叠;UI 自续定时器的计数断言必须使用客户端类型注册表,禁止用全局表。
(三)绝对时间不可测:多物理时钟折叠为单一虚拟时钟;断言必须基于相对时间因果,禁止基于绝对时间。
(四)信任边界:mock 结论以"模拟忠实"为前提,未驱动到的代码等于未验证,模拟失真的路径结论无效。该条件性可检验:模拟是否忠实、断言是否覆盖。
第5条(维护义务)
(一)引擎导出新增或产品重构时,mock 必须同步补齐;框架每次改动后必须全量回归证明零行为变化。
(二)框架不能支持某测试时必须改进框架,禁止降级测试;模拟失真必须修框架,禁止绕过。
(三)编写测试前必须先读 ARCHITECTURE.md 与对应系统语义文档。
第6条(术语)
| 节点 | 协议处理单元,集合由接入系统定义 |
| 协议 | 节点间消息类型,命名 源_目标_功能名 或 C2S_/S2C_ 前缀 |
| 虚拟时钟 | Mock.nClock,毫秒级确定性时间源 |
| trace | 结构化事件流,记录投递、处理、定时器与状态变更 |
| 开盒测试 | 逐步调用真实函数并断言内部状态的测试 |
| 攻击测试 | 注入乱序、丢包、延迟、崩溃、重复并断言不变量收敛的测试 |
| PIN 断言 | 按 PRD 正确行为编写的、当前代码必失败的断言 |
| MOCK-GAP | mock 框架自身缺口 |
| 方向约束 | 规定状态只能由权威源写入 |
| 序次收敛 | 以单调锚点去重,使接收方总能做唯一正确决策 |
| 边界熔断 | 强制切断正反馈回路(退出清定时器、重连强制重置) |





