gpt4 book ai didi

unit-testing - vue-test-utils:如何在 mounted() 生命周期 Hook (使用 vuex)中测试逻辑?

转载 作者:搜寻专家 更新时间:2023-10-30 22:12:01 25 4
gpt4 key购买 nike

我正在尝试为 Vue 的 mounted() 生命周期 Hook 中的逻辑编写单元测试,但运气不佳。问题似乎是当使用 vue-test-utils mount 挂载组件时,mounted() 永远不会被调用。这是我要测试的 Vue 组件:

<template>
<div></div>
</template>

<script>
export default {
name: 'MyComponent',
mounted () {
this.$store.dispatch('logout')
}
}
</script>

测试本身:

import { mount, createLocalVue } from '@vue/test-utils'
import Vuex from 'vuex'
import MyComponent from '@/components/MyComponent'

const localVue = createLocalVue()

localVue.use(Vuex)

describe('MyComponent.vue', () => {
let store
let actions

beforeEach(() => {
actions = {
logout: jest.fn().mockName('logout')
}
store = new Vuex.Store({
state: {},
actions
})
})

it('calls store "logout" action', () => {
mount(MyComponent, { localVue, store })
expect(actions.logout).toHaveBeenCalled()
})
})

但是,这失败了,expect(logout).toHaveBeenCalled() 断言为 false。

如果我直接使用 actions.logout() 调用模拟存储操作,则测试通过,并且我还有其他测试也调用存储操作,例如按下按钮,并且这些操作也通过,所以问题肯定出现在 mounted() 生命周期钩子(Hook)上。

有什么想法吗?

(vue 2.5.4 和 vue-test-utils 1.0.0-beta-.15)

最佳答案

不确定它有什么不同,但我将商店模拟抽象到另一个文件,现在一切似乎都正常工作。

模拟.js

export const storeMock = Object.freeze({
state: {},
actions: {
logout: jest.fn().mockName('logout')
},
})

test.spec.js

import { shallowMount, createLocalVue } from '@vue/test-utils'
import Vuex from 'vuex'
import { storeMock } from './mocks.js'
import MyComponent from '@/components/MyComponent'

const localVue = createLocalVue()

localVue.use(Vuex)

describe('MyComponent.vue', () => {
let options

beforeEach(() => {
jest.clearAllMocks()
const store = new Vuex.Store(storeMock)
options = { store, localVue }
})

it('calls store "logout" action', () => {
shallowMount(MyComponent, options)
expect(storeMock.actions.logout).toHaveBeenCalled()
})
})

关于unit-testing - vue-test-utils:如何在 mounted() 生命周期 Hook (使用 vuex)中测试逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50278708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com