Vue3 - 組件測試覆蓋率BUG(?)

set: 踩坑分享
tags: Vue Testing
category: Front-End
description: Vue3 - 組件測試覆蓋率BUG(?)
created_at: 2022/07/29 00:00:00

cover image


前言

今天剛才在練習寫測試的時候發生很莫名其妙的 BUG,事情大概是這樣的:

同樣一份 code,沒有動到任何 async 相關或是複雜的操作,理論上每一次跑測試應該都要是相同的結果(雖然我覺得就算有也應該都要相同,不然測試還有什麼意義)


事情是這樣子的

先聲明: 先不管說這個組件他本身需不需要被測試,但我預期他覆蓋率是 100%我就是想都看到100%怎麼樣XD

而在這時他執行時覆蓋率不是 100% 就算了,我把 code 亂改一下後變成 100% ,之後我再把 code 還原回去還是維持 100%,而且我確定他有抓到新的 code 沒有 cache,然後重新跑測試的指令又變回非 100%

你可能覺得我說的很亂,但他就是這麼詭異,直接上影片可能更清楚:

就是像影片這麼奇妙。

總之我只是想表達他呈現的覆蓋率怪怪的。


找到的解決方案

這是我後來找到的問題點跟解決方案。(不確定是不是真的是這樣,但這是我推測)

我的想法是說不定又是 Vue 的語法糖搞了事情,讓他沒有跟測試相關套件很好的整合。

因為在 SFC 單檔的 .vue 裡面可以只有 <template> 而沒有 <script>,可能我要的就是一個很純的 component,不想要有一些 javascript 的邏輯,只負責包裝。

在想會不會就是測試的時候想嘗試去戳那個 <script> 但沒戳到所以發生奇怪的問題,那你可能會問那為什麼在同一次指令運作的時候他就會忽然變成 100%,這個我就真的不知道他的運作邏輯了(知道的話歡迎跟我說,感謝大神XD),不過我也是在發生這問題才在亂戳想說他為什麼那邊總是怪怪的,結果加東加西測試之後 100%,想說我終於要找到覆蓋率沒滿的原因了嗎?! 結果沒有,我都整個程式碼恢復成原樣了居然還是 100%...

後來測試加上 <script> 做一點事就恢復正常了,空的 <script> 還不行,一定要有東西,就算沒有用到,例如下面這樣都可以:

<script setup>
const a = 5;
</script>
<script setup>
const fn = () => {
  return 'hi bug'
};
</script>

你可能會說第二個宣告函數的範例怪怪的,這樣不就又沒 100% 了,對 因為我只是想說這樣他功能就會正常了,像是這樣你沒對這函數寫測試他就會跟你說你 3-4 沒寫到測試,所以你再去補就好:

it("fn", () => {
  const wrapper = mount(WelcomeItem, {});
  const result = wrapper.vm.fn();
  expect(result).toBe("hi bug");
});

總結

雖然說測試覆蓋率不一定要到 100%,但就想說至少在起頭,練習的時候想先把起始專案弄到 100% XD,先獲得成就感,之後才會更有學習的動力~




最後更新時間: 2022年07月29日.