Commit e7ff8d1
committed
test(console): record:* 家族第一次有了行为证据,抓到 record:activity 恒空与 useMetadata 的渲染死循环 (#3149)
#3146 的 binding-reach 探针按设计看不见 record:* 家族——它们从
RecordContextProvider 取数,裸挂载什么都不做,"没有数据调用"因此不说明任何
问题。而那恰好是 objectstack#4413 待过的地方:四个 block 声明了没人读的
objectName/recordId,在真实记录页上渲染空白,全程门禁皆绿。
record-block-record-reach.test.tsx 把 11 个 public record:* block 挂在
record context 下,绑两条不同的同对象记录各挂一次,问 DOM 或数据调用有没有
变化。两道探针的行为覆盖 14 → 24 / 57。
几个刻意的设计决定:
- 两条记录而不是"绑 vs 不绑":不绑的对照组少一层 provider,useId 整体偏移,
于是每个块都"有差异"——探针自己制造绿。
- 差分而不是"渲染非空":后者对无视全部输入的块也恒为真,正是 #3149 记下
不覆盖展示原语的理由;在这里加一道同样的东西是自毁。
- 仪器本身被断言:每个块用记录 A 再挂一次,要求逐字节相同。这条一旦失败,
"A 和 B 不同"就不再等于"记录到达了输出",整个文件的绿就是噪声。
- 崩溃按崩溃报:SchemaRenderer 会把渲染期抛错画成错误卡片,而崩了的块对两条
记录渲染同一张卡片,不单独断言就会落进"无差异"档、被读成关于绑定的结论。
- 无外网:这家族有块直接调 fetch('/api/v1/security/explain'),happy-dom 下
打到 localhost:3000——原本"能跑"只是因为连接被拒。现在立即 reject,URL 进
同一份调用台账。
结果 8 个响应、3 个入 NO_RECORD_REACH 台账。台账条目必须写明宿主路径,因为
"宿主供数"只在真有宿主供数时才是理由:record:discussion(DiscussionContext,
RecordDetailView 挂)和 record:reference_rail(entries 由
buildDefaultPageSchema 注入)都核得住,record:activity 核不住——见 #3165。
顺带修掉一个探针挂不起来的缺陷:useMetadata() 的"优雅兜底"每次调用都新建对象,
provider 外每渲染一次 getItem 就换身份;useMetadataItem 把它放在 effect deps
里并 setState 一个全新对象 → 无限循环,同步到能把 render() 卡住。注释说它存在
是为了让 provider 外的单测能渲染,它恰恰让那些消费者挂不起来。改成冻结的模块级
单例,并让清空分支在已清空时 bail。
#3149 第 2 层同时落地,但原方案不存在:57 个 public block 没有任何一个声明
recordId 输入(全仓库仅 view:detail / detail-view 两处,都不 public)——和
objectstack#4472 方向 (d) 同一类结果。代之以 record:related_list /
record:line_items 的 required relationshipField + childObject 必须进子查询、
且 scope 到绑定的父记录,两个都成立。
Closes #3149
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S3cP1eY1novcNhQEDBrSZD1 parent a889e31 commit e7ff8d1
4 files changed
Lines changed: 751 additions & 23 deletions
File tree
- .changeset
- apps/console/src/__tests__
- packages/react/src/context
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
0 commit comments