Archived
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:
@@ -26,15 +26,27 @@
|
||||
* 就再也碰不到表头行(表头行在文档序上比所有数据行/种子行都晚,只有当两个 `<tbody>`
|
||||
* 都彻底没有 `<tr>` 时才轮得到它——而静态种子行保证了这种情况不会发生)。
|
||||
*
|
||||
* 这份测试**不能** `import` `packages/ui-kit/src/ViewContainer.tsx` 的 `bodyOf`/`addRow`——
|
||||
* 它们没有 `export`,而且 `activities/part-substitution-assessment` 自己的包内测试按
|
||||
* ADR-004 的 `activities-isolated` depcruise 规则只准 `import @sdk/@contracts/@sfeel`,
|
||||
* 够不着 `apps/api` 这一侧的 `renderView`;反过来 `apps-not-into-activities` 规则也不许
|
||||
* `apps/api` 侧的文件静态 `import activities/**`。所以这里用**真实的 `renderView()`**
|
||||
* (与 report.ts 的 `CHIP_TYPE_TABLE`/`TYPE_PARAM_TABLE` 结构逐字节对齐的镜像 fixture,
|
||||
* 见下面 `CHIP_TYPE_FRAGMENT`/`TYPE_PARAM_FRAGMENT` 头注)跑出「服务端会真的吐出什么
|
||||
* HTML」,再在 jsdom 里**逐行复刻** `bodyOf`/`addRow` 那两行选择器(标了对应的源码行号)
|
||||
* —— 测的是选择器路径本身的行为,不是字符串包含。
|
||||
* **这份测试守的是「W05 这两张表此刻的具体 HTML 形状是对的」,不是「addRow/bodyOf 这两个
|
||||
* 函数本身对不对」——两件事分给了两处测试,缺一不可**(2026-08-30 复审第二轮逼出来的教训:
|
||||
* 第一版这里的 `findAddRowTarget` 是纯手抄的选择器复刻,复审把真实 `ViewContainer.tsx:305`
|
||||
* 的 `tr:last-of-type` 换成明摆着错的 `tr:first-of-type` 重跑这 6 条,6/6 全绿零反应——
|
||||
* 全仓当时没有任何测试真的执行过 `bodyOf`/`addRow`)。
|
||||
*
|
||||
* `bodyOf`/`addRow` 现在**已经 `export`**(`packages/ui-kit/src/ViewContainer.tsx`,
|
||||
* 零行为改动,只是加宽可见性)——**真实函数的行为**由
|
||||
* `packages/ui-kit/__tests__/view-container-addrow.test.ts` 直接 `import` 它们去测
|
||||
* (合成的最小 fixture,不碰任何活动的 HTML;那份文件的变异验证证明了它真的会因为
|
||||
* `ViewContainer.tsx` 里选错选择器而变红)。**这份文件依然不 `import` 那两个函数**——
|
||||
* 不是 depcruise 拦着(`packages-are-leaves` 只禁 `packages → apps` 这一个方向,没禁
|
||||
* `apps → packages`),是**类型系统**拦着:`ViewContainer.tsx` 是 `.tsx`(含 JSX),
|
||||
* 编译它要 `"jsx": "react-jsx"` 这个 compiler option,而 `apps/api/**` 只受
|
||||
* `tsconfig.node.json` 管——那份配置没有 `jsx` 选项(它是 Node 后端,本不该解析 JSX)。
|
||||
* 所以这里仍然用**真实的 `renderView()`**(与 report.ts 的 `CHIP_TYPE_TABLE`/
|
||||
* `TYPE_PARAM_TABLE` 结构逐字节对齐的镜像 fixture,见下面 `CHIP_TYPE_FRAGMENT`/
|
||||
* `TYPE_PARAM_FRAGMENT` 头注)跑出「服务端会真的吐出什么 HTML」,再在 jsdom 里镜像
|
||||
* `bodyOf`/`addRow` 那两行选择器(标了对应的源码行号,与 `view-container-addrow.test.ts`
|
||||
* 里那份文本上完全一致)去读它——这里测的是**渲染结果的形状**,选择器路径本身的正确性已经
|
||||
* 交给上面那份文件去守,这里不重复承担那份责任。
|
||||
*/
|
||||
// @vitest-environment jsdom
|
||||
/*
|
||||
@@ -51,9 +63,13 @@ import { renderView } from '../internal/domain/view-render.ts';
|
||||
|
||||
/**
|
||||
* 复刻 `ViewContainer.bodyOf()` + `addRow()` 的选择器链(逐行对照
|
||||
* `packages/ui-kit/src/ViewContainer.tsx:164-167` 与 `:303-306`)——不 import 私有函数
|
||||
* (它们没有 `export`,且 `apps/api` 不许静态 import `activities/**`,这份测试也够不着
|
||||
* `packages/ui-kit`),只镜像**选择器本身**,在真实 jsdom Document 上跑。
|
||||
* `packages/ui-kit/src/ViewContainer.tsx:164-167` 与 `:303-306`)——两函数现在已经
|
||||
* `export` 了,但这份文件仍不 `import` 它们:`ViewContainer.tsx` 是 `.tsx`(含 JSX),
|
||||
* 编译要 `"jsx": "react-jsx"`,而 `apps/api/**` 只受 `tsconfig.node.json` 管、没有这个
|
||||
* compiler option——类型系统这一关过不去,不是 depcruise 拦着。真实函数的行为已经交给
|
||||
* `packages/ui-kit/__tests__/view-container-addrow.test.ts` 去直接 import 测了,这里
|
||||
* 只镜像**选择器本身**(与那份文件里的写法逐字一致),在真实 jsdom Document 上跑,
|
||||
* 用来验证 `renderView()` 吐出来的 HTML 形状。
|
||||
*/
|
||||
function findAddRowTarget(doc: Document, address: string): HTMLElement | null {
|
||||
// 镜像 bodyOf():单个 querySelector,按文档序返回第一个匹配
|
||||
|
||||
Reference in New Issue
Block a user