簡體   English   中英

我如何用玩笑測試承諾延遲?

[英]How do I test promise delays with jest?

這是我用來延遲過程的代碼(用於退避)

export function promiseDelay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

我想測試它,但我不能。 我嘗試使用 fakeTimers 但我的測試永遠不會結束。

test('promiseDelay delays for 1s', async (done) => {
    jest.useFakeTimers();
    Promise.resolve().then(() => jest.advanceTimersByTime(100));
    await promiseDelay(100);
  });

promiseDelay返回一個Promise是后消失ms所以稱之為spythen和測試,看是否spy有不同的時間間隔后,被稱為:

describe('promiseDelay', () => {

  beforeEach(() => { jest.useFakeTimers(); });
  afterEach(() => { jest.useRealTimers(); });

  test('should not resolve until timeout has elapsed', async () => {
    const spy = jest.fn();
    promiseDelay(100).then(spy);  // <= resolve after 100ms

    jest.advanceTimersByTime(20);  // <= advance less than 100ms
    await Promise.resolve();  // let any pending callbacks in PromiseJobs run
    expect(spy).not.toHaveBeenCalled();  // SUCCESS

    jest.advanceTimersByTime(80);  // <= advance the rest of the time
    await Promise.resolve();  // let any pending callbacks in PromiseJobs run
    expect(spy).toHaveBeenCalled();  // SUCCESS
  });

});

請注意,測試代碼是同步的, Timer Mocks使setTimeout同步,但then PromiseJobs回調排隊因此在測試是否已調用spy之前,需要允許任何排隊的回調運行。

這可以通過使用async測試函數並在已解決的Promise上調用await來完成,該PromisePromiseJobs結束時有效地將測試的其余部分排隊,允許任何掛起的回調在測試繼續之前運行。

有關如何承諾和假計時器相互作用可在我的答案的其他信息在這里

我認為你只需要從函數中返回承諾

test('promiseDelay delays for 1s',() => {
  jest.useFakeTimers();
  return Promise.resolve().then(() => jest.advanceTimersByTime(100));
});

然后監視要調用一次的 setTimeout。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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