【问题标题】:How to test vuex state and mutations correctly?如何正确测试 vuex 状态和突变?
【发布时间】:2022-02-11 02:54:15
【问题描述】:

告诉我如何正确测试突变和状态。我有一个模态窗口组件,如果 state 中的 showModal 属性为 true,它就会被渲染。并且有一个事件会导致更改属性的突变。 如何检查事件被调用后,组件不再渲染?我需要导入实际的 vuex 存储吗?

<template>
  <div>
   <transition name="fade" appear>
     <div ref="modal" class="modal-overlay"
       v-if="isShow"
       @click="close">
     </div>
   </transition>
 <transition name="pop" appear>
  <div class="modal"
       role="dialog"
       v-if="isShow"
  >
  <div class="layer">
      <slot name="content"></slot>
    </div>
  </div>
</transition>
</div>
import { mapState } from 'vuex'

export default {
  name: "VModal",
  computed:{
    ...mapState({
      isShow: state => state.showModal
    })
  },
  methods:{
    close(){
      this.$store.commit('SHOW_OR_HIDE_MODAL', false)
    }
  }
}




import Vuex from "vuex"
import { mount, createLocalVue } from "@vue/test-utils"
import VModal from '../../assets/src/components/VModal'
const localVue = createLocalVue()
localVue.use(Vuex)

describe('testing modal', () => {
let mutations
let state
let store

beforeEach(() => {
    state = {
        showModal: true
    }
    mutations = {
        SHOW_OR_HIDE_MODAL: jest.fn()
    }
    store = new Vuex.Store({ state, mutations })
})
test('check close modal', async () => {
    const wrapper = mount(VModal, {
        store, localVue
    })

    await wrapper.find(".modal-overlay").trigger("click")

    await wrapper.vm.$nextTick();
    expect(wrapper.find(".modal-overlay").exists()).toBe(false)
    expect(wrapper.find(".modal").exists()).toBe(false)
 })
})

我有 index.js 和 store

但是在点击后的测试中我得到了错误

我明白我做错了什么,但我不知道如何正确测试 vuex,抱歉这个愚蠢的问题,任何帮助将不胜感激

【问题讨论】:

  • 你嘲笑了 SHOW_OR_HIDE_MODAL,所以它不会改变 showModal。考虑使用真实商店进行测试并在 beforeEach 中重置状态
  • 你的意思是用真正的 store 导入 index.js 并在 new Vuex.Store() 中使用它?
  • 是的。您可以将重置功能添加到商店,或在 beforeEach 中使用 jest.isolateModules 重新导入
  • 好的,我导入import realStore from '../../assets/src/admin/pages/institutes/store/index' 并在beforeEach(() =&gt; { store = new Vuex.Store({ realStore }) }) 中使用然后我在触发点击await wrapper.find(".modal-overlay").trigger("click") 时出现错误。 [vue-test-utils]: find did not return .modal-overlay, cannot call trigger() on empty Wrapper
  • 如果您希望使用 showModal 显示模态框,则需要使其为真

标签: javascript vue.js jestjs vuex vue-test-utils


【解决方案1】:

在您的测试中,您将状态 showModal 设置为 true:

beforeEach(() => {
  state = {
    showModal: true
  }
  ...
})

因此您的叠加层被渲染,这就是您的测试条件解析为 true 的原因。

<div ref="modal" class="modal-overlay"
   v-if="isShow"
   @click="close">
 </div>
enter code here

您的“isShow”计算值指向测试中的 showModal = true。

【讨论】:

  • 但是点击触发器应该会导致一个突变,应该将modalShow更改为false,为什么在那之后,例如expect(wrapper.find(".modal-overlay").exists()).toBe(false)不起作用?
  • 触发器将无法“工作”,因为您正在模拟突变。您的 showModal 状态在您的测试范围内将始终为真。在你的真实应用中,它很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 2019-02-14
  • 2020-12-18
  • 1970-01-01
  • 2020-06-23
  • 2019-05-28
相关资源
最近更新 更多