jest中的级联计时器和异步函数

uqjltbpv  于 2022-12-16  发布在  Jest
关注(0)|答案(1)|浏览(148)

在此测试代码中,

test('test', async () => {
  jest.useFakeTimers();

  const cb = jest.fn();
  const func = jest.fn().mockResolvedValueOnce(1);

  setTimeout(async () => {
    setTimeout(() => {
      cb();
    }, 1000);
  }, 1000);

  jest.runAllTimers();
});

因为jest.runAllTimers()模拟了足够长的传球时间,

test('test', async () => {
  jest.useFakeTimers();

  const cb = jest.fn();
  const func = jest.fn().mockResolvedValueOnce(1);

  setTimeout(async () => {
    await func();
    setTimeout(() => {
      cb();
    }, 1000);
  }, 1000);

  jest.runAllTimers();

  expect(cb).toHaveBeenCalledTimes(1);
});

cb()从未被命中。
我应该如何修改此测试代码,使其正确命中cb并通过测试?

0tdrvxhp

0tdrvxhp1#

你的计时器是在解析承诺(从func返回)之后定义的。所以为了运行计时器,你必须等待它被启动。你可以通过等待func返回的承诺来完成。
要访问jestmock函数返回的数据,可以使用它的.mock属性
例如:

test('test', async () => {
    jest.useFakeTimers();
  
    const cb = jest.fn();
    const func = jest.fn().mockResolvedValueOnce(1);
  
    setTimeout(async () => {
      await func();
      setTimeout(() => {
        cb();
      }, 1000);
    }, 1000);
  
    jest.runAllTimers();
    await func.mock.results[0].value
    jest.runAllTimers();
  
    expect(cb).toHaveBeenCalledTimes(1);
  });

相关问题