meo*_*per 4 unit-testing vue.js vue-router vuex
我正在尝试安装一个使用Vuex的组件,并且需要模拟$ route.query
import { mount, shallow, createLocalVue } from 'vue-test-utils'
import Vue from 'vue'
import expect from 'expect'
import Vuex from 'vuex'
import VueRouter from 'vue-router'
import Post from '../../components/Post.vue'
const localVue = createLocalVue()
localVue.use(Vuex);
localVue.use(VueRouter);
describe('Lead list', () => {
let wrapper;
let getters;
let store;
beforeEach(() => {
getters = {
post: () => { return {} }
}
store = new Vuex.Store({
getters
});
});
it('should just be true', () => {
const $route = {
path: '/some/path',
query: {}
}
wrapper = shallow(Post, {
localVue,
mocks: {
$route
}, store
});
expect(true).toBe(true);
});
});
Run Code Online (Sandbox Code Playgroud)
我正在收回这个错误
TypeError: Cannot set property $route of #<VueComponent> which has only a getter
Run Code Online (Sandbox Code Playgroud)
我发现了关闭的问题https://github.com/vuejs/vue-test-utils/issues/142有类似的错误.但我的情况有点不同.如果我从选项中删除存储或模拟它可以正常工作,但是当你同时使用它们时它不起作用.这是一个问题还是我做错了什么?
谢谢
您收到此错误是因为您已通过调用在Vue构造函数上安装了VueRouter localVue.use(VueRouter)
.这会将$ route添加为localVue构造函数的只读属性.
然后你试图覆盖$router
使用mocks
.mocks
无法覆盖,$route
因为它已被Vue Router添加为只读属性.
要解决您的问题,您可以创建另一个localVue
,安装Vuex,然后使用mocks
传入$route
:
it('should just be true', () => {
const freshLocalVue = createLocalVue()
freshLocalVue.use(Vuex)
const $route = {
path: '/some/path',
query: {}
}
wrapper = shallow(Post, {
localVue,
mocks: {
$route
},
store
})
expect(true).toBe(true)
})
Run Code Online (Sandbox Code Playgroud)