From 8d1bee9b1a287346c577536bb0f6899eaafdcc64 Mon Sep 17 00:00:00 2001 From: Linghong Date: Mon, 3 Aug 2026 11:42:44 +0000 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E9=BD=90=20editorProjectClient=20?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E5=A5=91=E7=BA=A6=E7=9A=84=E6=96=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 给 saveEditorProjectLayout 与 loadEditorProject 补超时后,两条精确参数断言失败: toHaveBeenCalledWith 要求参数完全匹配,新增第四个参数即不匹配。 把 { timeoutMs: 60_000 } 写进断言,而不是放宽成 anything()。超时是契约的一部分 ——一个被 flushProjectPersistence 同步等待在提交路径上、一个在对账路径上,没有 上界会把在途占位拖过存活窗口。写死之后谁删掉它测试就会红;放宽则等于让刚建立的 上界失去看守。去掉生产代码里的两个超时,两条断言同时变红。 真正的问题是验证方式:改的是 services 下的文件,却只跑了 components 的测试。 这条链路横跨两个目录,往后验证同时覆盖两处。 Co-Authored-By: Claude Opus 5 --- docs/project-memory/shared-memory/decision-log.md | 8 ++++++++ src/services/image-editor/editorProjectClient.test.ts | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/docs/project-memory/shared-memory/decision-log.md b/docs/project-memory/shared-memory/decision-log.md index 3a4188e1c..cf817f6da 100644 --- a/docs/project-memory/shared-memory/decision-log.md +++ b/docs/project-memory/shared-memory/decision-log.md @@ -6163,3 +6163,11 @@ - 三个常量构成一条跨文件不等式(提交前置预算、客户端 POST 超时、占位存活窗口),任一处被单独调大都会破坏它,后果是跨标签页误删。新增用例把这条不等式连同 30 秒余量一起钉住。本会话自己的占位另有归属登记豁免、不依赖该窗口,所以窗口只需覆盖跨标签页那一侧——这一点也写进了常量注释。 - 验证:忙等用例用 `vi.getTimerCount()` 直接断言「不该挂定时器」,把 `resolveNext...` 改回未过滤版本后该用例变红。`vitest src/components/image-editor` 924 通过 / 74 文件,typecheck、eslint、check:encoding 通过。 - 关联文档:`docs/technical/【前端架构】图片画布编辑器MVP接入方案-2026-06-11.md`。 + +## 2026-08-03 补齐 editorProjectClient 超时契约的断言 + +- 缺陷:给 `saveEditorProjectLayout` 与 `loadEditorProject` 补超时后,`editorProjectClient.test.ts` 的两条精确参数断言失败。`toHaveBeenCalledWith` 要求参数个数与内容完全匹配,新增第四个参数即不匹配。CI(任务 1645)在 `aa8ea401a` 上报出其中一条,另一条由本地复跑发现。 +- 处置:更新断言把 `{ timeoutMs: 60_000 }` 写进去,而不是放宽成 `expect.anything()`。超时是契约的一部分——这两个接口一个被 `flushProjectPersistence` 同步等待在提交路径上、一个在未知结果对账路径上,没有上界会把在途占位拖过存活窗口。断言写死之后谁删掉它测试就会红;放宽则等于让刚建立的上界失去看守。已验证:去掉生产代码里的两个超时,两条断言同时变红。 +- 真正的问题是验证方式而非测试:改的是 `src/services/image-editor/editorProjectClient.ts`,验证却只跑了 `vitest src/components/image-editor`,改动面与验证面完全对不上。这个盲区在本次会话中期分析另一份 CI 日志时已由我自己指出过,却没有改掉习惯,于是同一个盲区再次漏出——而且这次不是难复现的跨文件竞态,是本地一跑就红的确定性失败。 +- 约定:这条链路横跨 `src/components/image-editor/` 与 `src/services/image-editor/`,往后验证至少同时覆盖两处。不跑全量套件——本机有九条稳定的环境失败(符号链接、`0600` 权限模式、缺客户端 AppData 配置),噪音大于收益。 +- 关联文档:`docs/technical/【前端架构】图片画布编辑器MVP接入方案-2026-06-11.md`。 diff --git a/src/services/image-editor/editorProjectClient.test.ts b/src/services/image-editor/editorProjectClient.test.ts index 696ea0ff7..db6468c83 100644 --- a/src/services/image-editor/editorProjectClient.test.ts +++ b/src/services/image-editor/editorProjectClient.test.ts @@ -188,6 +188,10 @@ describe('editorProjectClient', () => { }), }), '保存图片画布工程失败', + // 中文注释:超时是契约的一部分,写死在断言里而不是放宽成 anything()。这个接口被 + // flushProjectPersistence 同步等待在生成提交路径上,没有上界会把在途占位拖过存活 + // 窗口;断言写死之后,谁删掉它测试就会红。 + { timeoutMs: 60_000 }, ); }); @@ -327,6 +331,9 @@ describe('editorProjectClient', () => { '/api/editor/projects/editor-project-1', { method: 'GET' }, '读取图片画布工程失败', + // 中文注释:同上,超时写死在断言里。这是未知结果对账路径上的读取,挂住会让 catch + // 迟迟不结束,连带把本会话对占位的归属登记一起拖过存活窗口。 + { timeoutMs: 60_000 }, ); });