发现于 #3808 的实施过程:给 public-block-binding-reach.test.tsx 的 ledgered 分支加崩溃守卫时,顺手把守卫加到了两个分支上,于是这两个块立刻红了 —— 它们一直在这个探针里渲染成错误卡,只是没人看。#3808 的 PR 已把守卫收窄回 ledgered 分支(那才是它的改动可能造成的空绿),这两条另记本单。
按 observation-class 只贴 finding、不排队:这两个块的断言本身仍然成立(见下),所以今天没有假绿,请 triage 决定是产品缺陷还是 fixture 缺陷。
事实(objectui origin/main @ c85268256 + #3808 分支)
apps/console/src/__tests__/public-block-binding-reach.test.tsx 用 sampleFor 按每个 block 声明的 inputs 自动填一份 schema,然后挂载并记录数据层调用。把「渲染没崩」这一条也断言上之后:
× object-form asks the data layer for its objectName
<object-form> threw during render …
Component "object-form" failed to render
Cannot read properties of undefined (reading 'map')
× object-master-detail-form asks the data layer for its objectName
Component "object-master-detail-form" failed to render
Cannot read properties of undefined (reading 'map')
其余 14 个候选块全部渲染正常。
为什么今天不是假绿
这两个块不在 NO_DATA_REACH 里,所以它们走的是「必须有数据调用」那一支:
expect(reached.length, …).toBeGreaterThan(0);
实测它们确实发出了带 PROBE_OBJECT 的调用 —— 崩溃发生在取到数据之后的某一趟渲染里,不是在 fetch 之前。所以断言是挣来的,不是靠「什么都没产出」蒙的。
对比 ledgered 分支(如 record:related_list)就完全不同:那里的通过条件是「没有数据调用」,一个崩掉的块恰好满足它 —— 那才是必须堵的空绿,#3808 堵的就是那一处。
两种可能,需要 triage 分辨
分辨成本很低:把 sampleFor 生成的 schema 打出来,逐个 input 换成 undefined 二分,定位到具体那一条,再看该 input 的 spec 形状是不是允许样本那种值。
附带的建议
无论 (a) 还是 (b),这个探针最终都应该像它的兄弟 record-block-record-reach.test.tsx 那样对两个分支都断言「渲染没崩」(那个文件里叫 assertRendered)。现在只有 ledgered 分支有,是因为 #3808 不该把两个 pre-existing 崩溃拖进一个补 inputs 声明的 PR。这两条修掉之后,守卫就可以提到断言之前、对所有候选生效。
参考位置
apps/console/src/__tests__/public-block-binding-reach.test.tsx —— sampleFor(样本生成)、dataCallsFor(现在会把 html 一起带出来)、ledgered 分支的崩溃守卫
apps/console/src/__tests__/record-block-record-reach.test.tsx —— assertRendered,两分支通用守卫的现成形状
关联:#3808、#3838、#3149、objectstack#4472、objectstack#4413
发现于 #3808 的实施过程:给
public-block-binding-reach.test.tsx的 ledgered 分支加崩溃守卫时,顺手把守卫加到了两个分支上,于是这两个块立刻红了 —— 它们一直在这个探针里渲染成错误卡,只是没人看。#3808 的 PR 已把守卫收窄回 ledgered 分支(那才是它的改动可能造成的空绿),这两条另记本单。按 observation-class 只贴
finding、不排队:这两个块的断言本身仍然成立(见下),所以今天没有假绿,请 triage 决定是产品缺陷还是 fixture 缺陷。事实(objectui
origin/main@c85268256+ #3808 分支)apps/console/src/__tests__/public-block-binding-reach.test.tsx用sampleFor按每个 block 声明的inputs自动填一份 schema,然后挂载并记录数据层调用。把「渲染没崩」这一条也断言上之后:其余 14 个候选块全部渲染正常。
为什么今天不是假绿
这两个块不在
NO_DATA_REACH里,所以它们走的是「必须有数据调用」那一支:实测它们确实发出了带
PROBE_OBJECT的调用 —— 崩溃发生在取到数据之后的某一趟渲染里,不是在 fetch 之前。所以断言是挣来的,不是靠「什么都没产出」蒙的。对比 ledgered 分支(如
record:related_list)就完全不同:那里的通过条件是「没有数据调用」,一个崩掉的块恰好满足它 —— 那才是必须堵的空绿,#3808 堵的就是那一处。两种可能,需要 triage 分辨
columns: []让列表走空态不 fetch;裸 Proxy 被 spread 后丢掉所有方法;sections: ['name']被 spread 成{0:'n',1:'a'}后在DetailView里死于reading 'name')。reading 'map'的形状高度相似 —— 某个array输入被填成['name'],而 form 侧期待的是对象数组,于是在某处.map前先取了个undefined。若是这一类,修法是给该 input 一个像样的样本,并把它加进这个文件的样本表 + 头注释(第五、第六次)。record:related_list写了add但漏了add.picker,整个相关列表被换成「Component failed to render」错误卡 ——RelatedList.tsx:1299裸取add.picker.object,同一文件:378/:390是可选链 #3838(RelatedList.tsx:1299裸取add.picker.object)是同一族:一个可选子键缺失,整块变错误卡。分辨成本很低:把
sampleFor生成的 schema 打出来,逐个 input 换成undefined二分,定位到具体那一条,再看该 input 的 spec 形状是不是允许样本那种值。附带的建议
无论 (a) 还是 (b),这个探针最终都应该像它的兄弟
record-block-record-reach.test.tsx那样对两个分支都断言「渲染没崩」(那个文件里叫assertRendered)。现在只有 ledgered 分支有,是因为 #3808 不该把两个 pre-existing 崩溃拖进一个补inputs声明的 PR。这两条修掉之后,守卫就可以提到断言之前、对所有候选生效。参考位置
apps/console/src/__tests__/public-block-binding-reach.test.tsx——sampleFor(样本生成)、dataCallsFor(现在会把html一起带出来)、ledgered 分支的崩溃守卫apps/console/src/__tests__/record-block-record-reach.test.tsx——assertRendered,两分支通用守卫的现成形状关联:#3808、#3838、#3149、objectstack#4472、objectstack#4413