You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Vitest与Vue-Test-Utils模拟Vue-Router遇错求助

问题:使用Vitest模拟Vue-Router时持续报错

我正在尝试理解Vitest模拟Vue-Router的逻辑,在一个简单项目中搭建测试环境并进行模拟操作。按照Vue-Test-Utils官方文档步骤执行时始终报错,怀疑是文档使用Jest导致的差异。虽然使用真实Vue-Router可以解决问题,但我更倾向于采用模拟方式。以下是项目源码、报错信息以及我已尝试的模拟方法,请求帮助解决:

Home.vue

<script setup lang="ts">
import {onMounted} from "vue";
import {useRoute} from "vue-router";

const route = useRoute()

onMounted(() => {
  console.log(route.query)
})
</script>

<template>
  <div>Home</div>
</template>

Home.spec.ts(初始版本)

import {expect, it, vi} from "vitest";
import {mount} from "@vue/test-utils";

import Home from "../src/components/Home.vue"

it('Home Test', async () => {
    const wrapper = mount(Home)

    expect(wrapper.exists()).toBeTruthy()
})

vite.config.ts

/// <reference types="vitest" />
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  test: {
    environment: 'jsdom',
    include: ['./test/**/*.spec.ts'],
    exclude: ['node_modules', 'dist'],
    globals: true
  }
})

报错信息

Error Message 1
Error Message 2

已尝试的方法

我尝试了两种方式模拟vue-router:

vi.mock('vue-router', () => ({
    useRoute: vi.fn(),
}))

或仅使用:

vi.mock('vue-router')

最终的Home.spec.ts文件

import {expect, it, vi} from "vitest";
import {mount} from "@vue/test-utils";

import Home from "../src/components/Home.vue"

vi.mock('vue-router')

it('Home Test', async () => {
    const wrapper = mount(Home, {
        global: {
            stubs: ["router-link", "router-view"]
        }
    })

    expect(wrapper.exists()).toBeTruthy()
})

解决方案

问题出在仅模拟vue-router模块但未给useRoute返回包含query属性的对象,组件在onMounted中访问route.query时会因route无对应属性报错。

正确的模拟方式需要让useRoute返回符合预期的对象,具体修改如下:

import {expect, it, vi} from "vitest";
import {mount} from "@vue/test-utils";
import Home from "../src/components/Home.vue"

// 模拟vue-router并指定useRoute的返回值
vi.mock('vue-router', () => ({
  useRoute: vi.fn(() => ({
    query: {} // 可根据测试需求设置具体参数,比如{ id: '123' }
  }))
}))

it('Home Test', async () => {
  const wrapper = mount(Home, {
    global: {
      stubs: ["router-link", "router-view"]
    }
  })

  expect(wrapper.exists()).toBeTruthy()
})

关键说明:

  • vi.mock的工厂函数需返回包含useRoute的对象,且useRoute要返回带query属性的对象,匹配组件对route的使用逻辑。
  • 若需在测试中动态修改query值,可手动调用mock方法修改返回值:
    import { useRoute } from 'vue-router'
    
    // 在测试用例中
    const mockUseRoute = useRoute as vi.Mock
    mockUseRoute.mockReturnValue({ query: { id: '456' } })
    

内容的提问来源于stack exchange,提问作者Mocha_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:35:24