网站搜索

单元测试 - 无法读取未定义的属性 (Vue, Vuex, Typescript, vue-test-utils, jest)


我刚开始接触测试,正在尝试用 vue-test-utils(jest) 设置第一个单元测试。我想写第一个简单的测试,只检查组件是否是 Vue 实例,但我遇到了一个错误,我不太理解。看起来我的测试试图访问组件,但失败了,因为它无法读取 $store.state。我使用了来自 vuex 状态的计算属性。组件本身运行正常,并且导入一切都是正确的。我哪里做错了吗?我也尝试过模拟 store,但没有用。我已经安装了 ts-jest、vue-jest、jest、@types/jest 和 @vue/test-utils。

我在 package.json 中的 jest 配置:

    "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
    "moduleFileExtensions": [
      "js",
      "ts",
      "json",
      "vue"
    ],
    "transform": {
      ".*\\.(vue)$": "vue-jest",
      "^.+\\.tsx?$": "ts-jest"
    },
    "testURL": "http://localhost/"
  }
}

我的 测试 文件:

import Login from '../Login.vue'
import { createLocalVue } from '@vue/test-utils'
import Vuex from 'vuex'

const localVue = createLocalVue()

localVue.use(Vuex)

describe('Login.vue', () => {
  let state: any;
  let store: any;

  beforeEach(() => {
    state = {
      errorMsg: jest.fn(),
      error: jest.fn()
    }
    store = new Vuex.Store({
      state
    })
  })

  it('is a Vue instance', () => {
    const wrapper = mount(Login, { store, localVue })
    expect(wrapper.isVueInstance()).toBeTruthy()
  }) 
})

答案#1

这个 StackOverflow 问题 TypeError: 无法读取未定义的属性 'getters'

帮助我解决了我的问题。我把计算写成这样:

get loginErrorMsg() { return this.$store.state.auth.errorMsg; }

并使用了 vuex 中的 mapState,如下所示,并且效果非常好。

@Component({
  computed: {
    ...mapState(["errorMsg", "token"])
  }
})
export default class Login extends Vue {...}