#はじめに
Vue.jsでVuexを使った時のテストの仕方が全然わからなくて
ちょっと前進したので忘れないうちにメモ
間違いがあったら教えていただけると嬉しいです。
#テスト対象
<template>
<div class="hello">
<p>{{nowNumber}}</p>
</div>
</template>
<script>
import {mapState} from 'vuex'
export default {
name: 'HelloWorld',
computed: {
...mapState(['nowNumber'])
},
}
</script>
state
の値を表示するだけのコンポーネント
##カウント用
###インクリメント(足す)
<template>
<div class="increment">
<button class="increment__button" @click="incrementButton">足す</button>
</div>
</template>
<script>
export default {
methods: {
incrementButton() {
this.$store.dispatch("increment");
},
},
};
</script>
ボタンを押したらactions
経由でmutations
からstate
に加算
###デクリメント(引く)
<template>
<div class="decrement">
<button @click="decrement">引く</button>
</div>
</template>
<script>
export default {
methods: {
decrement() {
this.$store.dispatch('decrement')
},
},
};
</script>
###リセット
<template>
<div class="reset">
<button @click="reset">リセット</button>
</div>
</template>
<script>
export default {
methods: {
reset() {
this.$store.dispatch("reset");
},
},
};
</script>
基本的にこの3つはほぼ同じでメソッド名とかが違うくらい
##Vuex(Store)
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export const state = {
nowNumber: 0
}
export const mutations = {
increment(state) {
state.nowNumber++
},
decrement(state) {
if (state.nowNumber <= 0) return
state.nowNumber--
},
reset(state) {
state.nowNumber = 0
}
}
export const actions = {
increment({ commit }) {
commit('increment')
},
decrement({ commit }) {
commit('decrement')
},
reset({ commit }) {
commit('reset')
}
}
export default new Vuex.Store({
state,
mutations,
actions
})
ストアの部分はこんな感じです
そしてこれをテストする
##テストコード
import { createLocalVue } from '@vue/test-utils'
import Vuex from 'vuex'
import { cloneDeep } from 'lodash'
import { actions, mutations } from '../../store/index.js'
const state = {
nowNumber: 0
}
const initStore = () => {
return cloneDeep({
state,
mutations,
actions
})
}
let store
let localVue
beforeEach(() => {
localVue = createLocalVue()
localVue.use(Vuex)
store = new Vuex.Store(initStore())
})
describe('store', () => {
it('dispatch incremetnt', () => {
expect(store.state.nowNumber).toBe(0)
store.dispatch('increment')
expect(store.state.nowNumber).toBe(1)
})
it('dispatch decrement', () => {
store.state.nowNumber = 1
expect(store.state.nowNumber).toBe(1)
store.dispatch('decrement')
expect(store.state.nowNumber).toBe(0)
store.dispatch('decrement')
expect(store.state.nowNumber).toBe(0)
})
it('dispatch reset', () => {
store.state.nowNumber = 5
expect(store.state.nowNumber).toBe(5)
store.dispatch('reset')
expect(store.state.nowNumber).toBe(0)
})
it('dispatch まとめテスト', () => {
store.dispatch('increment')
expect(store.state.nowNumber).toBe(1)
store.dispatch('increment')
expect(store.state.nowNumber).toBe(2)
store.dispatch('decrement')
expect(store.state.nowNumber).toBe(1)
store.dispatch('reset')
expect(store.state.nowNumber).toBe(0)
})
})
この場合だとストアをクローン
してそれを実行してテストしている感じになります。
なのでAPIとか使った物だとこれだと毎回通信してしまうと思うのでダメですね
ここは次の課題です
ひとまずこれでテストしたら無事に全部PASSしました。