コンポーネントメソッドを単体テストしようとしています。質問 here は、単体テストからコンポーネントメソッドにアクセスする方法を示していません。
具体的には、以下のVueコンポーネントを指定した場合、ユニットテストからdoSomeWork()
にアクセスするにはどうすればよいですか?
Vueコンポーネント:
<template>
<div id="ThisStuff">
<span>
Some other stuff is going on here
</span>
</div>
</template>
<script>
import foo from 'bar'
export default {
props: {
ObjectWithStuffInIt: [
{
id: 1
bar: false
},
{
id: 2
bar: false
},
]
},
data: {
foo: "foo"
},
methods: {
doSomeWork: function() {
for (var i = 0; i < ObjectWithStuffInIt.length; i++) {
if (foo === "diddly") {
ObjectWithStuffInIt[i].bar = true;
}
}
}
}
}
</script>
私のテストコード:
import {createLocalVue, shallow} from 'vue-test-utils'
import ThisVueFile.test.js from '../../thisPlace/ThatPlace/ThisVueFile.vue'
import Vuex from 'vuex'
const localVue = createLocalVue()
localVue.use(Vuex);
describe('ThisVueFile.test.js', () => {
let user;
let store;
beforeEach(() => {
let getters = {
user: () => user
}
store = new Vuex.Store({ getters })
})
// I need to fill propsData: with some local data here
// because it is server data
// I need to have access to the method
// I need to use local data for `foo` in the test.
it(' When foo is set to -diddly- then set bar to true ', () => {
foo = "diddly";
// run the method in the component here
doSomeWork();
expect(OjbectWithStuffInIt[0].bar.equals(true));
})
})
propsData
shallowMount
(または mount
)を使用してコンポーネントラッパーを作成する場合、options
を初期-で渡すことができます。 propsData
:
import MyComponent from "@/components/MyComponent";
//...
it('...', () => {
const wrapper = shallowMount(MyComponent, {
localVue,
propsData: {
myItems: [
{ id: 200, bar: false },
{ id: 300, bar: false }
]
}
});
})
ラッパーはvm
プロパティを介してコンポーネントインスタンスへのアクセスを提供するため、次のようにしてメソッドを直接呼び出すことができます。
wrapper.vm.doSomeWork()
同様に、コンポーネントのデータプロパティに直接アクセスできます。
wrapper.vm.foo = 'something'
まとめると、テストは次のようになります。
import { createLocalVue, shallowMount } from '@vue/test-utils'
import MyComponent from '@/components/MyComponent'
describe('MyComponent', () => {
it('When foo is set to -something-, set bar to true', () => {
const myItems = [
{ id: 200, bar: false },
{ id: 300, bar: false }
]
const localVue = createLocalVue()
const wrapper = shallowMount(MyComponent, {
localVue,
propsData: {
myItems
}
})
wrapper.vm.foo = 'something'
wrapper.vm.doSomeWork()
expect(myItems[0].bar).toBe(true)
})
})