带有笑话的Vuex-无法读取未定义的属性<gettername>

时间:2018-09-01 10:41:13

标签: javascript vue.js jestjs vuex

我正在尝试使用Jest测试Vue组件,该组件利用Vuex中的吸气剂。 getter返回一个函数,该函数又返回一个数组:

questions: state => pageNumber => state.pages[pageNumber].questions

我在组件中像这样使用它:

computed: {
  inputs() {
    return this.$store.getters.questions(this.pageNumber);
  },
},

这在呈现UI方面似乎很好,但是当尝试测试组件时,我得到了Cannot read property 'questions' of undefined

我的测试非常简单,但是我之前没有在Vuex中使用Jest,所以我可能会误解您如何测试使用吸气剂的组件:

import Vuex from 'vuex';
import { mount, createLocalVue } from '@vue/test-utils';
import SurveyQuestionBuilder from '../components/SurveyQuestionBuilder.vue';
import store from '../store';

const localVue = createLocalVue();
localVue.use(Vuex);

describe('SurveyQuestionBuilder.vue', () => {
  it('renders a value from $store.state', () => {
    const wrapper = mount(SurveyQuestionBuilder, { store, localVue });

    expect(wrapper.exists()).toBeTruthy();
  });
});

我认为这与吸气剂中的pages[pageNumber]有关,但不确定如何解决。

Store.js导入几个模块:

import Vue from 'vue';
import Vuex from 'vuex';
import surveyBuilderStore from './survey_builder';
import matrixStore from './matrix';

Vue.use(Vuex);

export default new Vuex.Store({
  modules: {
    survey: surveyBuilderStore,
    matrix: matrixStore,
  },
});

有问题的模块是surveyBuilderStore:

const surveyBuilderStore = {
  state: {
    pages: [],
  },
  getters: {
    pages: state => state.pages,
    questions: state => pageNumber => state.pages[pageNumber].questions,
    config: state => (pageNumber, questionNumber) =>
      state.pages[pageNumber].questions[questionNumber].config,
  },
  mutations: {
    // my mutations
  }
};

1 个答案:

答案 0 :(得分:0)

在问题获取者中,您搜索的是页面数组中可能未知的索引。

由于questions: state => pageNumber => state.pages[pageNumber]为空且state.pages大于0,因此pageNumber未定义。

为避免这种情况,您可以执行以下操作:

questions: state => pageNumber => {
    return state.pages[pageNumber] 
       ? state.pages[pageNumber].questions 
       : [] // <-- here your default value
}

您可以在测试中设置pageNumber的值,但我不知道它是组件的属性还是数据:

有关数据:

mount(SurveyQuestionBuilder, { 
    store, 
    localVue, 
    data:() => ({ pageNumber: 0 }) 
})

对于道具:

mount(SurveyQuestionBuilder, { 
    store, 
    localVue, 
    propsData: { pageNumber: 0 } 
})