Devotd Github
新发现开发工具

sonukapoor/warpdom — fast mode mock 还原基准变更(#236)

在 warpdom 的 fast mode 中,setup 文件创建的 mock 的还原方式发生了变化:不再比较属性描述符,而是从第一次 mock 到 cleanup 跟踪各个键并恢复原始值(commit 79d0d92,2026-11-02)。

仓库信息sonukapoor/warpdom ↗

在 warpdom 的 fast mode 中,setup 文件创建的 mock 的还原方式发生了变化:不再比较属性描述符,而是从第一次 mock 到 cleanup 跟踪各个键并恢复原始值(commit 79d0d92,2026-11-02)。

GitHub 项目说明: A DOM for unit tests that loads almost instantly and behaves like jsdom

星标
★ 4
复刻
0
语言
JavaScript
许可证
MIT
最新版本
v0.1.3
查看原始来源 ↗在 GitHub 查看 ↗

sonukapoor/warpdom 是用于单元测试的 DOM 实现。仓库说明称它"几乎瞬间加载,并且像 jsdom(Node 的浏览器 DOM 实现)一样工作"。2026 年 11 月 2 日的 commit 79d0d92 合并了 PR #236。在 fast mode 中,测试文件之间重置时,还原 setup 文件所创建的 mock 的基准发生了变化。此前通过比较成员的属性描述符(getter 和 setter)来挑选还原目标,现在则跟踪各个键,从第一次 mock 一直到最后一次 mock 结束的 cleanup,并恢复原始值。这是处理 issue #230 的变更。

判断基准从"要还原什么"转向了"何时结束"。`warpdom/vitest/reset` 包装了 `vi.stubGlobal`、`vi.spyOn`、`vi.unstubAllGlobals`、`vi.restoreAllMocks` 以及各 spy 的 `mockRestore`,把第一次 mock 替换之前的值记录为原值。无论中间的 getter 和 setter 如何变化,都使用该原值进行还原。过去存在这样的问题:setup 文件创建的 stub 如果被 Vitest 的 cleanup 或测试解除,那么下一个文件的 setup 再次 stub 同一成员时,先前的 stub 值就会被固化为原值;这种方式可以避免该情况。文档 fast-mode.md 记载,Vitest 4 和 5 中 `vi.restoreAllMocks` 同时 spy getter 和 setter 之后留下 getter spy 的问题(测量版本为 4.1.12、5.0.3)也改为还原原值。本次提交是跨 10 个文件、共 425 行的变更(+327/-98),涉及文档、src/vitest-reset.js、src/vitest.js、fixtures/vitest-fast 夹具、test/vitest-adapter.test.js 等。

不过,适用范围仅限于 fast mode。在 Vitest 3 中,仍然存在 `vi.restoreAllMocks` 会把已经 `mockRestore()` 过的 spy 再次恢复为先前值的问题(测量版本 3.2.4,未使用 warpdom),文档也明确将其标注为"未覆盖"。每个 worker 只加载一次的模块所设置的全局值(polyfill 等),以及测试改写的、例如 `global.fetch = vi.fn()` 这样的值,都不属于还原对象。本次提交未包含单独的性能数值或基准测试结果,因此实际改进幅度仅凭该提交难以判断。来源是 GitHub 上的 commit 79d0d92。