首页 文章

Jest:如何模拟vuex中使用的vue-router

提问于
浏览
0

我试图在vuex的操作中使用vue-router,这在localhost上工作正常 .

但是,当我尝试通过从商店文件导入“操作”来准备商店(用于模拟)时,我遇到了错误 .

你能帮帮我解决这个问题吗?



versions

vue-test-utils: 1.0.0-beta.16
yarn: 1.5.1
vuejs: 2.5.13
vue-jest: 1.4.0

error msg

FAIL  test/components/main.test.js
  ● Test suite failed to run

    /Users/gulliver/Desktop/test/vue-test-utils-jest-example/node_modules/vue/dist/vue.esm.js:10809
    export default Vue$3;
    ^^^^^^

    SyntaxError: Unexpected token export

      at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:305:17)
      at Object.<anonymous> (src/router/main.js:1:203)
      at Object.<anonymous> (src/store/main.js:3:13)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        2.354s
Ran all test suites matching /test\/components\/main.test.js/i.
error An unexpected error occurred: "Command failed.
Exit code: 1


app/src/main.js

import Vue from "vue/dist/vue.esm";
import App from './App.vue'
import store from './store/main.js';
import router from './router/main.js';

new Vue({
  el: '#app',
  render: h => h(App),
  store,
  router,
})

app/src/store/main.js

import Vue from "vue";
import Vuex from 'vuex';
import router from '../router/main.js'

Vue.use(Vuex)

export const actions = {
  locationTo(context, url){
    router.push(url)  
  }
}
export default new Vuex.Store({
  actions,
})

app/src/router/main.js

import Vue from "vue/dist/vue.esm";
import VueRouter from 'vue-router';
import root from '../components/root.vue';
import hoge from '../components/hoge.vue';

Vue.use(VueRouter)

export const routes = [
  { path: '/', component: root},
  { path: '/hoge', component: hoge},
];

export default new VueRouter({
  mode: 'history',
  routes
})

app/test/components/main.test.js

import Vue from "vue";
import Vuex from "vuex";
import { shallowMount, createLocalVue } from "@vue/test-utils";

import { actions } from "@/store/main"; //NOTE: this causes error

import _ from "lodash";
const localVue = createLocalVue();

import root from '@/components/root.vue'
import hoge from '@/components/hoge.vue'

describe('increment.vue', () => {
  let propsData;
  let store;
  let wrapper;

  beforeEach(() => {
    propsData = _.cloneDeep(personObject)

    store = new Vuex.Store(_.cloneDeep({
      actions,
    }))

    const $route = {
      path: '/hoge', components: hoge
    }

    wrapper = shallowMount(root, {
      localVue,
      propsData,
      store,
      use: ['Vuex'],
      stubs: ['router-view'],
      mocks: {
        $route
      }
    })

  });

  it('test:router in store', () => {
    // check if URL changed after action executed
  });

})

组件

// App.vue
<template>
  <div id="app">
    <router-view></router-view>
  </div>
</template>

// root.vue
<template>
  <div>
    <p>root component</p>
  </div>
</template>

<script>
export default {
  mounted () {
    this.$store.dispatch('locationTo', '/hoge')
  },
}
</script>

// hoge.vue
<template>
  <div>
    <p>hoge template</p>
  </div>
</template>

1 回答

  • 0

    此错误与Jest在Node.js环境中运行的事实有关,并且您正在使用 export default ,这在Node.js中默认不起作用(Node使用 module.exports ) . 我猜您正在使用webpack进行开发/ 生产环境 构建,但不适用于测试环境 .

    你在用Jest吗?如果是这样,您将需要设置 babel-jest ,以便Jest知道如何读取ES模块语法( import/export ) .

    在这里阅读更多:https://vue-test-utils.vuejs.org/guides/#testing-single-file-components-with-jest

    这可能很烦人,如果您需要更多帮助以使其正常工作,请告诉我 .

相关问题