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

Nuxt Test Utils 4.0.0 最近发布,核心变化就一件大事:绑定 Vitest v4。但别急着升级——这次改动把测试环境的启动时机整个后移,相当于把"先搭台后唱戏"改成了"报完节目单再搭台"。

旧版本里,mock 经常像个迟到的演员:你明明通知了它要替换某个角色,结果人家已经上台了。具体来说,vi.mockmockNuxtImport在拦截中间件、插件里的组合式函数时,常常因为执行顺序问题被直接跳过。4.0.0 把环境初始化从setupFiles挪到beforeAll,mock 注册完毕才让 Nuxt 启动,算是给这个陈年 bug 补了票。

代价是写法要变。以前在describe顶层直接调用useRouter()没问题,现在会报错——台子还没搭好,演员当然找不到后台。得把这类调用包进beforeAll里:

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/test-utils 管组件单元测试,Playwright、Cypress 管浏览器里跑端到端,Nuxt Test Utils 卡在中间:能启完整 Nuxt 应用、验服务端渲染、在真实插件上下文里挂组件。每周 npm 下载 47 万次,Nuxt 模块生态基本绕不开它。

从 v3 迁移或从废弃的 nuxt-vitest 包转过来的,官方文档和 GitHub 迁移 issue 里有详细步骤。一个 Reddit 用户的反馈很典型:升级后终于不用在测试里写 "mock 没生效再跑一遍" 的注释了。