如何在Vitest中对next/navigation进行模拟?

前端开发 2026-07-12

我正在努力寻找一个通用解决方案,以便在Next.js中用Vitest对导航进行模拟。

next-router-mock 提到“在Next.js v13、v12、v11和 v10上进行了测试。”因此我不确定是否能在Next 14中使用它。此外,README中并未提及Vitest。

我找到的唯一可行解决方案是:

vi.mock('next/navigation', async () => {
  const actual = await vi.importActual('@/__mocks__/next/navigation')
  return {
    ...actual,
    useRouter: () => ({
      push: vi.fn(),
      replace: vi.fn(),
      refresh: vi.fn(),
      back: vi.fn(),
      prefetch: vi.fn()
    }),
    useParams: () => ({ book_id: '123 })
  }
})

但这需要在所有测试文件中进行。如果我尝试在 test.setup.ts 全局处理,并将其用作 vi.mocked(useParams).mockReturnValue({ id: book_id }),就会失败,出现 vi.mocked(...).mockReturnValue is not a function

解决方案

aliasvitest.config.ts 中使用,而不是 vi.mock()

alias: {
  'next/navigation': '/your-project/__mocks__/next/navigation.ts',
}

所以基本上,这将使 next/navigation 直接解析到你的模拟文件(该文件导出 vi.fn() 实例),因此 vi.mocked() 在任何地方都能工作,而无需在每个测试文件中重复 vi.mock()

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章