Vue3 で作っているコンポーネントのテストを書こうとしています。
js
1it('test', () => { 2const wrapper = shallowMount(Target); 3 console.log(wrapper.html()) 4 wrapper.find(".edit-button").trigger("click") 5})
下記がテスト対象のコンポーネント(簡略化してます)ですが、上記のようにwrapper.html()を出力した際にv-forの部分が出力されません。そのためtrigger("click")も実行できません。
wrapper.vm.hoge を出力してみるとしっかりとclient.getHoge()で取得した値が取れています。
console.log(wrapper.html())段階ではhogeがnullなのでしょうか?
これはなぜでしょう?
template
1 <div v-for="h in hoge" :key="h"> 2 <button class="edit-button" @click="edit(id)">編集</button> 3 </div> 4
<div>{{hoge}}</div> のようにしてもhogeは出力されていなかったので、やはりonMountedでhogeを取得する前のデータでレンダリングされていて、hogeを取得した後にdomが更新されていないのかな?と思いましたが、原因がわかりません。js
1 2 const hoge = ref(null) 3 4 onMounted(async () => { 5 const response = await client.getHoge() 6 hoge.value = response.data.hoge 7 })
まとめると、
wrapper.vm.hoge には値が入っているのでonMountedは実行されている事が分かります。
しかしwrapper.html()はそれが反映していない&trigger("click")できない、
という状況です。
こちら解決できる方いましたらお手数ですがご教示いただけますと幸いです。
補足でsetup全体を載せます。メソッドの中身など関係ない部分は一部省略します。
js
1setup() { 2 const router = useRouter() 3 const store = useStore() 4 const hoge = ref(null) 5 6 onMounted(async () => { 7 const response = await client.getHoge() 8 hoge.value = response.data.hoge 9 }) 10 11 const edit = (id) => { 12 console.log("goEdit -> id", id) 13 store.commit('huga/hugaEdit', id) 14 router.push({ name: 'EditPage'}) 15 } 16 17 return { 18 hoge, 19 edit 20 } 21}
ただ、これ一応解決していて、下記のようにテスト側で
wrapper.find(".edit-button").trigger("click")
の前に下記のように一瞬スリープを入れるとdomが更新されるようでした。
しかしなぜこのようにラグがあるのでしょうか・・・
vmの値が更新される→DOM更新となると思うのですが、sleepしないとvmが更新されているのにdomが更新されないというのも変な気がします・・・
js
1const _sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); 2await _sleep(1); 3wrapper.find(".edit-button").trigger("click")
あなたの回答
tips
プレビュー