fix(w05): Task 7b 评审 fix round 2 —— 6 条 DOM 测试是空的,bodyOf/addRow 加 export 后补真测试

复审用变异逮到:把 ViewContainer.tsx:305 的 tr:last-of-type 换成明摆着错的 tr:first-of-type
重跑 view-render-addrow-thead.test.ts 新增的 6 条,6/6 全绿零反应。根因:那 6 条只 import 了
一份手抄的选择器复刻(findAddRowTarget),与真实实现之间没有任何绑定,ViewContainer.tsx 换掉
选择器它不会跟着变 —— 全仓当时没有任何测试真的执行过 bodyOf/addRow,对这两个函数的未来回归
零防护。

「不能 export/import」这条前提是错的:packages-are-leaves 只禁 packages→apps,没有任何规则
禁 apps→packages;bodyOf/addRow 只是没加 export——加 export 是零行为改动。本轮第三次踩同一条
(Task 4 读数函数、Task 6 let 镜像,现在是选择器):禁令属实,但抄多了,能 import 的都该 import。

①ViewContainer.tsx:165/303 给 bodyOf/addRow 加 export,函数体一字未改。
②新增 packages/ui-kit/__tests__/view-container-addrow.test.ts(5 条),照 view-container-
collect.test.ts 的写法直接 import 真实函数,合成最小 fixture(不碰任何活动 HTML)。写的时候
自己踩过两处:addRow 的 appendChild 把新行接到 <table> 下面不是插回原 tbody/thead(断言要查
内容不能查落点);tr:last-of-type 与 tr:first-of-type 在单行行组里永远等价(补一组两行的
动态 tbody + data-marker 才让两个选择器真正分道扬镳)。变异验证:选择器换错后 1/5 真红
(row-2 变 row-1),复原验绿。

③两处测试的头注写清各守各的:新测试守机制(addRow/bodyOf 面对通用形状的真实行为),原 6 条
守 W05 这两张表此刻的具体 renderView() 输出形状是对的(选择器仍是镜像,但选择器本身的正确性
已交给新测试)——头注同时改正了此前「不能 import 是 depcruise 拦着」的错误说法,真实原因是
ViewContainer.tsx 含 JSX、需要 tsconfig.web.json 的 jsx 选项,apps/api 只受 tsconfig.node.json
管,类型系统这一关过不去。

pnpm gates 退出码 0(2422 passed | 34 skipped);E04/I01 包内测试 92/92、55/55 全绿,零回归。
报告同批刷新了上一轮贴错版本的失败输出证据(用当前最终代码重新跑过变异)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LKMZDwMbyKzjw6Hembwvet
This commit is contained in:
xcs
2026-08-30 01:00:58 +08:00
co-authored by Claude Opus 5
parent 57870329e6
commit 832c662fdb
3 changed files with 174 additions and 14 deletions
+2 -2
View File
@@ -162,7 +162,7 @@ function replaceInPlace(doc: Document, html: string): void {
}
/** 一张可改的表的容器(tbody)—— 按 `data-edit` 地址找 */
function bodyOf(doc: Document, address: string): HTMLElement | null {
export function bodyOf(doc: Document, address: string): HTMLElement | null {
return doc.querySelector<HTMLElement>(`[data-edit="${CSS.escape(address)}"]`);
}
@@ -300,7 +300,7 @@ export function dropRow(row: HTMLElement): 'removed' | 'marked' | 'unmarked' {
* 一张空表(一行都没有)加不了行 —— 没有可照的样子;那种情形本来也不该由人开头
* (行由活动写下,人改的是它写错的地方)。
*/
function addRow(doc: Document, address: string): boolean {
export function addRow(doc: Document, address: string): boolean {
const host = bodyOf(doc, address);
const last = host?.querySelector<HTMLElement>('tr:last-of-type');
if (host === null || last == null) return false;