Skip to content

client-react 没有任何测试基座:8 个公开 hook 的行为全靠 typecheck 兜底 #4682

Description

@os-zhuang

#4678 时发现,按第十条军规立案,unassigned。

现象

packages/client-reactpackage.json 只有 buildtypecheck 两个脚本,没有 test,src/ 下也没有任何测试文件。它导出 8 个公开 hook:

useMetadataSubscription / useDataSubscription / useMetadataSubscriptionCallback / useDataSubscriptionCallback / useRealtimeConnection / useAutoRefresh(以及 #4678 新增的 useBulkDataSubscription / useBulkDataSubscriptionCallback)。

这些 hook 的正确性完全没有运行时验证。typecheck 只能证明它们类型对,证明不了:

  • useEffect 的依赖数组对不对(漏一项 → 订阅不随 object 变化重建,换对象后还在收旧对象的事件);
  • 卸载时是否真的 unsubscribe(漏了 → 内存泄漏 + 幽灵回调);
  • useAutoRefresh 是否真的在事件到达时调了 refetch

最后一条正是 #4678 修的那个 bug 的形状:它对批量写不刷新,而这件事 typecheck 永远看不见。同类缺陷可以再次静默溜进来。

为什么没有顺手在 #4678 里补

全仓没有任何 DOM 测试基座:

  • 没有根 vitest.config.ts / vitest.workspace.ts;
  • 全仓 package.json 里 grep 不到 jsdom,也 grep 不到 @testing-library/*

所以给 hook 写测试不是"加一个 .test.tsx",而是要引入 jsdom + @testing-library/react(或 react-hooks 等价物)两个新的 devDependency、配 vitest environment、并让它进 CI 的 Test Core 分片。这是个该由维护者定的取舍(新依赖 + CI 时长),不该作为一个 hook 修复的 rider 夹带进来。

处置方向

  1. client-reacttest: vitest run + 一份 vitest.config.ts(environment: 'jsdom');
  2. devDeps 加 jsdom + @testing-library/react;
  3. 起步测试覆盖三件 typecheck 覆盖不到的事:依赖数组导致的重订阅卸载时退订回调确实被调用(useAutoRefresh 对逐记录和批量两条流都要断言);
  4. 确认它被 CI 的 turbo test 任务捡到。

参考

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions