pnpm test(turbo 全量)在 main 上有一个稳定失败的测试文件,不是断言失败,是 suite 根本没跑起来。发现于 objectui#3160(objectstack#4115 台账批次 6)的全量验证,与该批次无关,按 AGENTS.md Prime Directive #10 单独登记。
现象
FAIL packages/plugin-calendar/src/registration.test.tsx [ src/registration.test.tsx ]
Error: [vitest] No "subscribeDataChanges" export is defined on the "@object-ui/react" mock.
Did you forget to return it from "vi.mock"?
❯ src/CalendarView.tsx:13:1
Test Files 1 failed | 2 passed (3) / Tests 13 passed (13) —— 断言全过,失败的是整份文件的加载。
确认是既有问题,不是某个分支引入的
在 objectui#3160 的工作树里把该分支的全部改动 git stash -u 之后,单独跑同一个文件:
$ pnpm --filter @object-ui/plugin-calendar exec vitest run src/registration.test.tsx
Test Files 1 failed (1)
Tests no tests
即基线提交(e3aea83)上就是红的。批次 6 只改动 data-objectstack / plugin-chatbot / plugin-list,plugin-calendar 不依赖其中任何一个。
成因
registration.test.tsx 用 vi.mock('@object-ui/react', …) 做整模块替换,而 CalendarView.tsx 从该模块 import 的 subscribeDataChanges 不在 mock 的返回对象里。vitest 4 对整模块 mock 的缺失导出是硬报错(不再静默给 undefined),所以这份 mock 每新增一个被消费的 @object-ui/react 导出就会失效一次。
建议修法
不是把缺失的名字补进去了事 —— 那只是把同一个陷阱推迟到下一个新导出。改用 importOriginal 的部分 mock,只覆盖这份测试真正要控制的函数:
vi.mock(import('@object-ui/react'), async (importOriginal) => ({
...(await importOriginal()),
// 只在这里列出要替换的
}))
附带一条观察(不确定是否同一件事)
同一次全量跑里 @object-ui/plugin-gantt 也报了 ELIFECYCLE,但单独跑 pnpm --filter @object-ui/plugin-gantt exec vitest run 是 35 文件 / 340 断言全绿。形态与 objectstack#4115 批次 4 记录的「并行 worktree 内存压力导致的文件级错误漂移」一致,可能只是并发下的资源问题,与本 issue 的 mock 缺陷不是一回事。
pnpm test(turbo 全量)在main上有一个稳定失败的测试文件,不是断言失败,是 suite 根本没跑起来。发现于 objectui#3160(objectstack#4115 台账批次 6)的全量验证,与该批次无关,按 AGENTS.md Prime Directive #10 单独登记。现象
Test Files 1 failed | 2 passed (3)/Tests 13 passed (13)—— 断言全过,失败的是整份文件的加载。确认是既有问题,不是某个分支引入的
在 objectui#3160 的工作树里把该分支的全部改动
git stash -u之后,单独跑同一个文件:即基线提交(
e3aea83)上就是红的。批次 6 只改动data-objectstack/plugin-chatbot/plugin-list,plugin-calendar不依赖其中任何一个。成因
registration.test.tsx用vi.mock('@object-ui/react', …)做整模块替换,而CalendarView.tsx从该模块 import 的subscribeDataChanges不在 mock 的返回对象里。vitest 4 对整模块 mock 的缺失导出是硬报错(不再静默给undefined),所以这份 mock 每新增一个被消费的@object-ui/react导出就会失效一次。建议修法
不是把缺失的名字补进去了事 —— 那只是把同一个陷阱推迟到下一个新导出。改用
importOriginal的部分 mock,只覆盖这份测试真正要控制的函数:附带一条观察(不确定是否同一件事)
同一次全量跑里
@object-ui/plugin-gantt也报了ELIFECYCLE,但单独跑pnpm --filter @object-ui/plugin-gantt exec vitest run是 35 文件 / 340 断言全绿。形态与 objectstack#4115 批次 4 记录的「并行 worktree 内存压力导致的文件级错误漂移」一致,可能只是并发下的资源问题,与本 issue 的 mock 缺陷不是一回事。