![](/img/trans.png)
[英]Code coverage concern on promise/asynchronous unit testing using nockjs and jest
[英]Asynchronous Javascript code testing using Jest works when it is not supposed to
Jest的文檔提供了一個負面示例,說明了在測試異步代碼時不應該做什么。 我是這樣實現的:
const expect = require('expect');
function fetchData(cb) {
setTimeout(cb('peanut butter2'), 1500);
}
test('the data is peanut butter', () => {
function callback(data) {
expect(data).toBe('peanut butter');
}
fetchData(callback);
});
我運行了npx jest test.js
,這是輸出:
Fabians-MacBook-Pro:playground fabian$ npx jest test.js
FAIL ./test.js
✕ the data is peanut butter (6ms)
● the data is peanut butter
expect(received).toBe(expected)
Expected value to be (using Object.is):
"peanut butter"
Received:
"peanut butter2"
at callback (playground/test.js:9:22)
at fetchData (playground/test.js:4:16)
at Object.<anonymous>.test (playground/test.js:12:5)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 1 total
Snapshots: 0 total
Time: 0.866s, estimated 1s
Ran all test suites matching /test.js/i.
我不明白結果。
為什么即使我沒有調用done(),它也能正常工作,如Jest建議的那樣,您還是可以測試異步代碼? 我非常確定setTimeout是異步的,因為我使用console.log()語句在空白測試腳本中對其進行了測試,而第二個則在包含在setTimeout函數中的第一個之前觸發。
此外,當我的超時設置為1500ms時,測試在0.866s內失敗。 如果根本不應該調用我的回調,Jest怎么會收到錯誤的回調數據(花生醬2)?
因為您的測試看起來應該是async
,但實際上由於代碼錯誤而實際上是synchronous
。
你有以下內容,看起來像它的設計要調用的方法cb
后1500ms
, 但是你打電話cb
立刻 :
setTimeout(cb('peanut butter2'), 1500);
依次將string
傳遞到您的callback
函數中,該函數立即/同步運行expect
。
您可能想要的是這樣的:
setTimeout(function() { cb('peanut butter2') }, 1500);
或者,讓setTimeout
將arg傳遞給您的cb
函數並調用它:
setTimeout(cb, 1500, 'peanut butter2')
實際會在1500ms
之后調用cb
函數,這與預期的一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.