(十一)Jest 中的 mock timer

2022-05-19 08:45:09 字數 2156 閱讀 1376

平時開發中我們經常用到定時器setinterval 或者settimeout ,現在我們就寫乙個定時器的測試用例**如下:

// demo.js

export const lazy = (fn)=> , 3000);

}// demo.test.js

import  from './timerdemo'

test('should call fn after 3s', () => , 3001);

})

使用npm run test執行測試用例,執行結果如下:

如何解決這個問題呢?

方法一:

此時我們利用done()來解決這個問題,**如下:

import  from './timerdemo'

test('should call fn after 3s', (done) => , 3001);

})

方法二:今天我們學習一種新的解決辦法,使用mock timer解決這個問題。jest 提供了mock timer 的功能,不要再使用真實的時間在這裡等了,乙個假的時間模擬一下就可以了。首先是jest.usefaketimers() 的呼叫,它就告訴jest 在以後的測試中,可以使用假時間。當然只用它還不行,因為它只是表示可以使用,我們還要告訴jest在哪個地方使用,當jest 在測試的時候,到這個地方,它就自動使用假時間。兩個函式,jest.runalltimers(), 它表示把所有時間都跑完。具體到我們這個測試,我們希望執完lazy(callback) 就呼叫, 把lazy函式中的3s時間立刻跑完。可以使用jest.runalltimers();

具體**如下:

import  from './timerdemo'

jest.usefaketimers();//可以使用假函式

test('should call fn after 3s', () => )

如果有多個定時器的時候,我們修改demo.js的**如下:

export const lazy = (fn)=> ,3000)

}, 3000);

}

此時執行測試用例的時候,兩個定時器會立馬都被執行掉。但如果我們只想執行最外層的那個定時器時,我們需要引入 runonlypendingtimers() ,只執行乙個定時操作。具體**如下: 

export const lazy = (fn)=> ,3000)

}, 3000);

}import from './timerdemo'

jest.usefaketimers();//可以使用假函式

test('should call fn after 3s', () => )

自己試著執行一下我們會發現,只有第乙個執行了。

同時也可以使用 jest.advancetimer() 快進幾秒。

具體**使用如下:

export const lazy = (fn)=> ,3000)

}, 3000);

}import from './timerdemo'

jest.usefaketimers();//可以使用假函式

test('should call fn after 3s', () => )

執行結果發現只執行了第乙個定時器,如果還想執行第二個,我們可以修改demo.test.js**如下:

import  from './timerdemo'

jest.usefaketimers();//可以使用假函式

test('should call fn after 3s', () => )

此時兩個定時器都會執行。  使用jest.advancetimersbytime(n)快進n時間執行定時,多個advancetimerbytime連用時,後乙個會以前乙個的時間為基點,如果不想互相影響,我們可以使用鉤子函式beforeeach解決這個問題。

前端***:掃碼進去

Jest測試初學(二) Jest 中的匹配器

讓jest監聽所有測試 test.js 檔案的變化,如果有變化就自動跑測試用例 scripts 執行測試用例 jest自帶test和expect方法 比較結果的匹配器 test 測試加法 3 7 expect a tobe test 測試加法 3 7 expect a toequal test 測試...

Jest測試初學(五) Jest中的鉤子函式

jest中的鉤子函式相當於生命週期函式,在執行測試用例時,有先後呼叫的順序。一 jest常用的鉤子函式 beforeall 在測試用例執行之前執行 beforeeach 在每乙個測試用例執行之前執行 afterall 在測試用例執行結束之後執行 aftereach 在每乙個測試用例執行之後執行 im...

Jest 中鉤子函式

首先,我們來寫乙個類,並把它放入乙個檔案 counter.js 中,如下。class counter addone minusone export default counter下面,我們來寫乙個測試檔案,測試這個類。如下。import counter from counter.js const c...