Skip to content

[finding] KanbanRenderer.uncolumned.test.tsx 的两条断言落在 React.lazy 边界之后,未按 §测试纪律 在模块作用域预载 ./KanbanImpl #3465

Description

@yinlianghui

发现于 #3459(PR #3464)的实现过程 —— 我给自己新增的两个看板测试补了这条预载,顺手发现同包里既有的一个文件没有。属于潜在 flaky,当前没见它红过,故打 finding、不进队列。

事实

packages/plugin-kanban/src/index.tsx:

const LazyKanban = React.lazy(() => import('./KanbanImpl'));
...
<Suspense fallback={<Skeleton className="w-full h-[600px]" />}>
  <LazyKanban ... />
</Suspense>

packages/plugin-kanban/src/KanbanRenderer.uncolumned.test.tsx 直接渲染 KanbanRenderer,两条断言都在这个 Suspense 边界之后:

expect(await screen.findByText('Orphaned card')).toBeInTheDocument();   // 第 42 行
expect(await screen.findByText('Matches')).toBeInTheDocument();         // 第 60 行

文件顶部只 import { KanbanRenderer } from './index' —— 那只登记了 lazy 工厂,并不执行 import('./KanbanImpl')。所以首次渲染时的动态 import 被记在 RTL findBy 默认的 1000ms 预算里。

AGENTS.md §测试纪律 正是这一条:满并行下实测一次首包 import() 可达 976ms,已吃掉 1000ms 预算的 97.6%,红绿取决于机器负载而非被测代码。

该文件在 vitest.config.mtsheavyDomTests 里,但这不解决问题:vitest.setup.dom.tsx 只 side-effect import 了 @object-ui/components / fields / plugin-dashboard / plugin-grid,没有 plugin-kanban;而且即使有,./index 也只登记工厂,不会预热 KanbanImpl

修法

按 §测试纪律,在测试文件模块作用域直接 import,并加一行注释说明原因:

import './KanbanImpl';

specifier 必须与 ./index 里的完全一致(ESM 按解析后的 specifier 缓存),这样组件自己的 lazy 工厂才会立刻 resolve。不要beforeAll 预热 —— 它受 hookTimeout(10s)约束,比它取代的 testTimeout(15s)更窄,而且已被 object-ui/no-dynamic-import-in-test-hook 机械禁止。

PR #3464 里给 ObjectKanban.overlayTitleI18n.test.tsxObjectKanban.overlayTitleNoProviderFallback.test.tsx 做的就是这个,可直接照抄注释。

同包其余两个文件不受影响(已核)

  • registration.test.tsx —— 断言的是注册表解析,不落在 lazy 边界之后;
  • cardPredicateScope.test.tsx —— 已经静态 import KanbanBoard from './KanbanImpl' 并直接渲染,天然规避。

定级说明

按 §测试纪律 的判据这是「潜在竞态」而不是「已发生的失败」:目前没有记录显示该文件红过。但这类问题的症状是负载相关的偶发红,单跑永远绿,所以不宜等它真红了再修。相关前情:objectui#3010。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions