【发布时间】: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