使用虛擬計時器
在某些情況下,當您的程式碼使用計時器 (setTimeout
、setInterval
、clearTimeout
、clearInterval
) 時,您的測試可能會變得不可預測、緩慢且不穩定。
為了解決這些問題,或者如果您需要在程式碼中依賴特定的時間戳記,大多數測試框架都提供了將測試中的真實計時器替換為虛擬計時器的選項。這會產生一個副作用 - 在測試中使用虛擬計時器時,測試中的所有程式碼都會使用虛擬計時器。
設定虛擬計時器的常見模式通常在 beforeEach
中,例如
// Fake timers using Jest
beforeEach(() => {
jest.useFakeTimers()
})
由於虛擬計時器正在模擬原生的計時器函式,因此必須在測試執行後還原計時器,就像一般的模擬一樣。這可以防止虛擬計時器洩漏到其他測試案例和清理函式中,而這些函式需要使用真實的計時器。
為此,您通常會在 afterEach
中呼叫 useRealTimers
。
在切換回真實計時器之前,也務必呼叫 runOnlyPendingTimers
。這將確保您在切換回真實計時器之前刷新所有待處理的計時器。如果您沒有推進計時器,而是直接切換回真實計時器,則排定的任務將不會執行,並且您會得到意外的行為。這對於您不了解的第三方排定任務的情況尤其重要。
以下是使用 jest 執行此操作的範例
// Running all pending timers and switching to real timers using Jest
afterEach(() => {
jest.runOnlyPendingTimers()
jest.useRealTimers()
})
注意
將虛擬計時器與 user-event
結合使用可能會導致測試逾時。請參閱 advanceTimers
選項以防止此問題。