vue-test-utils:在同一测试中模拟vue-router和vuex

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有类似的错误.但我的情况有点不同.如果我从选项中删除存储或模拟它可以正常工作,但是当你同时使用它们时它不起作用.这是一个问题还是我做错了什么?

谢谢

Edd*_*Edd 5

您收到此错误是因为您已通过调用在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)

  • 我不能让它工作。要么有一个路由器,而 $route 不能被模拟,要么没有路由器,我得到了大量的错误,因为代码依赖于一个路由器。我不明白 $route 不能被嘲笑的设计决定。 (2认同)