簡體   English   中英

在不應該使用Jest的情況下,使用Jest進行異步Java代碼測試

[英]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.

我不明白結果。

  1. 為什么即使我沒有調用done(),它也能正常工作,如Jest建議的那樣,您還是可以測試異步代碼? 我非常確定setTimeout是異步的,因為我使用console.log()語句在空白測試腳本中對其進行了測試,而第二個則在包含在setTimeout函數中的第一個之前觸發。

  2. 此外,當我的超時設置為1500ms時,測試在0.866s內失敗。 如果根本不應該調用我的回調,Jest怎么會收到錯誤的回調數據(花生醬2)?

因為您的測試看起來應該是async ,但實際上由於代碼錯誤而實際上是synchronous

你有以下內容,看起來像它的設計要調用的方法cb1500ms但是你打電話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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM