[Day 17] useCopyToClip 測試

我們會測試五種情況

a. 測試初始狀態
 
這個用例檢查初始狀態時,isCopied 應該是 false,並且返回的第二個值應該是一個函數。
b. 測試 execCommand
這個用例是在 navigator.clipboard 不可用的情況下進行的,檢查是否會使用 document.execCommand 方法作為備用,並且發出一個警告。
c. 測試 navigator.clipboard 的成功情況
這個用例檢查在成功使用 navigator.clipboard 來復制文本時,isCopied 應該被設置為 true
d. 測試狀態回退
這個用例檢查 isCopied 是否會在 3 秒後被重置為 false
e. 測試出錯情況
這個用例檢查當 navigator.clipboard.writeText 拋出錯誤時,isCopied 是否會被設置為 false,並且是否會有正確的錯誤信息輸出到控制台。
 
完整測試
 
beforeEachafterEach 中,進行一些初始化和清理工作。特別是對 navigator.clipboard 進行了 mock,因此在測試過程中,原本的 navigator.clipboard 不會被調用,就跟我們當初sessionStorage測試方法一樣。
 

特別說一下console.warn 與 console.error吧,之前好像都沒寫過

console.warnconsole.error 的 mocking(模擬),主要是為了檢查這些函數是否被正確地調用,並且是否用正確的參數被調用。這樣的模擬可以在代碼在出錯或需要警告時能夠正確反應。同時,這種模擬還防止了這些警告和錯誤信息實際被打印到測試運行時的控制台,使輸出保持清晰和乾淨。
以下是對這兩個函數模擬的具體步驟的解釋:

1. 使用 jest.spyOn 進行模擬

這個函數會“攔截”對特定對象方法的調用,可以檢查方法是否被調用,以及它被調用時使用的參數。

2. 檢查模擬的方法

一旦方法被模擬,就可以檢查它是否被調用,以及它的調用方式:

3. 還原模擬

在測試結束後,模擬的方法應該被還原,以防止對其他測試或代碼的干擾。這是一個良好的實踐,可以避免出現意外的副作用。
通過這種方式,就能夠驗證 console.warnconsole.error 是否被正確調用,還能保持測試輸出的整潔,避免由於實際調用這些方法而產生的不必要的控制台消息。