Vueのmounted()
ライフサイクルフック内のロジックの単体テストを記述しようとしていますが、あまりうまくいきません。問題は、コンポーネントが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()ライフサイクルフック。
何かご意見は?
(vue _2.5.4
_およびvue-test-utils _1.0.0-beta-.15
_)
どのように違うのかはわかりませんが、私はストアのモックを別のファイルに抽象化しましたが、すべてが今は機能しているようです。
mocks.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()
})
})