【发布时间】: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(() => { 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