【问题标题】:How do I test promise delays with jest?如何用 jest 测试承诺延迟?
【发布时间】:2019-03-11 10:29:46
【问题描述】:

这是我用来延迟进程的代码(用于退避)

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);
  });

【问题讨论】:

    标签: javascript ecmascript-6 jestjs es6-promise babel-jest


    【解决方案1】:

    promiseDelay 返回一个在ms 之后解析的Promise,因此在then 中调用spy 并测试是否在不同的时间间隔后调用了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 queues a callback in PromiseJobs 因此在测试是否已调用 spy 之前,需要允许运行任何排队的回调。

    这可以通过使用async 测试函数并在已解析的Promise 上调用await 来完成,这在PromiseJobs 结束时有效地对测试的其余部分进行排队,从而允许任何挂起的回调在测试之前运行继续。

    我的回答here 中提供了有关承诺和假计时器如何交互的其他信息。

    【讨论】:

    【解决方案2】:

    我认为你只需要像这样的函数返回承诺

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

    然后窥探要调用一次的 setTimeout。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-05
      • 2016-07-23
      • 2014-11-16
      • 2015-03-08
      • 2015-03-27
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多