【问题标题】:'Route with name 'something' does not exist' vue-router console.warn when using vue-test-utils使用 vue-test-utils 时,'名称为'某物'的路由不存在' vue-router console.warn
【发布时间】:2021-09-18 19:10:56
【问题描述】:

我正在使用 vue-test-utils 为使用 vue-router 的 vue.js 组件制作测试代码。

这里是与此相关的代码。

const Routes = [{
  ...
 }, ...
 {
  ...,
  path: '/transfers',
  name: 'transfers',
  redirect: '/transfers/all',
  ...
 },...]

Routes.ts

export default class Transfers extends Vue {
  ...
  @Watch('$route', { immediate: true })
  async setDataResource (value: any) {
    const routeParams = value.params
    const paramKey: string = Object.keys(routeParams)[0]
    ...
  }
}

Transfers.vue

import { shallowMount, createLocalVue } from '@vue/test-utils'
import VueRouter from 'vue-router'
import Routes from '../../router/Routes'

const localVue = createLocalVue()
localVue.use(VueRouter)
...
const router = new VueRouter({ Routes })

...
describe('Elements', () => {
  const div = document.createElement('div')
  div.id = 'root'
  document.body.appendChild(div)

  router.push({ name: 'transfers', params: { processing: 'all' } })

  const wrapper = shallowMount(Transfers, {
    localVue,
    store,
    router,
    attachTo: '#root'
  })
  ...
})

transfers.test.js

我想做的是用参数在 $route 上测试手表。

它与 'params: { processing: 'all' }' 配合得很好,但是

console.warn
      [vue-router] Route with name 'transfers' does not exist

出现。

我可以在 .vue 中使用 router.push({ name: 'transfers' }) ,所以我认为该名称已正常注册到路由。但仅用于测试,'Route with name 'transfers'' 似乎没有找到。

Routes.ts 文件最初没有为路由使用名称选项,但我添加了它,因为我可以仅使用名称选项将参数推送到路由器。我的意思是,我们的项目不需要名称选项!

所以我的问题是,

  • 有没有办法在测试代码中将参数推送到路由器,而不使用路由中的名称选项?
  • 如果我应该使用名称选项,为什么这个警告只在测试时出现?

【问题讨论】:

  • 尝试包装声明wrapper.vm.$router.push({ name: 'transfers', params: { processing: 'all' } })
  • new VueRouter({ Routes }) 应该是 new VueRouter({ routes })(导入也应该命名为 routes)。
  • @FatimaMazhit 感谢您的回答!我尝试了您的建议const wrapper = shallowMount(Transfers, { localVue, store, router, attachTo: '#root' }) wrapper.vm.$router.push({ name: 'transfers', params: { processing: 'all' } }),但出现了同样的警告:(
  • @tony19 谢谢!感谢您的回答,我可以仅使用 wrapper.vm.$router.push({ path: '/transfers/failed' }) 之类的路径推送参数。我们有什么规则可以使用routes 而不是Routes
  • 是的。 VueRouter 构造函数需要routes,因此必须使用特定的密钥。键在 JavaScript 中区分大小写。

标签: javascript vue.js vue-router router vue-test-utils


【解决方案1】:

我在上一个项目中做了很多测试。我总是嘲笑我的 $route 和 $router(参见 sn-p)。我已经为我正在测试的页面创建了一个 Codepen(包括整个文件)。它显示了我的基本设置以及我测试路由对象的一些方法。即

let mocks = {
  $route: {
    path: '/some-path',
    query: {
      amount: null,
      loanType: null
    }
  },
  $router: [],
  $validator: {
    validateAll: jest.fn()
  },
  $toast: {
    show: jest.fn(),
    error: jest.fn()
  },
  $withProcessing: jest.fn()
}

在不跳入代码的情况下准确诊断你的问题有点困难,但我希望你能从下面得到一些对你有所帮助的东西。

https://codepen.io/RuNpiXelruN/pen/XWRKmoE

【讨论】:

  • 感谢您的回答!我想我理解了你的建议并尝试了它,但它失败了......我制作了mocks = { $route: { path: '/transfers/all', params: { processing: 'all' } } } 并将其添加到包装器wrapper = shallowMount(Transfers, { localVue, store, mocks, 但是当我在.vue@Watch('$route', { immediate: true }) async setDataResource (value: any) { console.log(value) 中进行控制台登录时,它返回undefined。 ..
猜你喜欢
  • 2020-09-16
  • 2019-02-20
  • 2019-10-24
  • 2018-05-04
  • 2019-01-05
  • 2020-07-03
  • 2019-02-10
  • 2019-07-16
  • 2021-09-19
相关资源
最近更新 更多