打开网易新闻 查看精彩图片

Nuxt Test Utils 4.0.0 版本最近发布,这是该库合并包生命周期后的首个主版本。作为 Vue 生态中衔接单元测试与端到端测试的关键工具,它每周 npm 下载量超过 47 万次,此次更新直接绑定了 Vitest v4,并顺手解决了一个让开发者头疼多年的 mock 失效问题。

最狠的改动是把测试环境初始化从 setupFiles 挪到了 beforeAll 钩子。旧版本里,vi.mock 和 mockNuxtImport 经常拦不住中间件里的组合式函数——那些函数跑得太快,mock 还没生效就被执行了。现在延迟到 beforeAll 初始化,mock 注册完 Nuxt 才启动,行为终于可预测了。

代价是 describe 顶层直接调用 useRouter() 或 useNuxtApp() 会报错。得改成这样:

describe('router test', () => {
let router: ReturnType
beforeAll(() => {
router = useRouter()
})
})

mockNuxtImport 也变得更聪明,现在会把原始实现传给工厂函数。想部分 mock 不用从零造对象,包装一下真实实现就行。

registerEndpoint 修复了两个细节:测试间重置模块时端点配置不再丢失,带查询参数的 URL 模式也能正常匹配了。

Vitest v4 的严格规则也跟着进来了。以前访问 mock 工厂没返回的导出项会静默返回 undefined,现在直接抛错。官方建议用 importOriginal 展开保留原始导出,只覆盖需要的部分。

对等依赖收紧了:happy-dom 要 20.0.11+,jsdom 要 27.4.0+,@jest/globals 不再支持 30.0.0 以下版本。锁定旧版本的团队得一起升级。

在 Vue 测试生态里,@vue/test-utils 管组件单元测试,Playwright 和 Cypress 管浏览器端到端,Nuxt Test Utils 卡在中间——它能启动完整 Nuxt 应用,做 SSR 校验,在真实插件和组合式函数上下文里挂组件。这个定位让它成了 Nuxt 模块开发者的标配。

从 v3 迁移或从废弃的 nuxt-vitest 包迁过来的,可以查官方文档和 GitHub 上的迁移指南。一位开发者在 issue 里留言说,beforeAll 改动虽然要改代码,但终于不用猜 mock 为什么没生效了——这大概是 4.0 最实在的收益。