如何在循环中测试setTimeout和async函数- Jest

tzdcorbm  于 2023-06-20  发布在  Jest
关注(0)|答案(3)|浏览(115)

这是我的函数,它基本上是在一个带有等待步骤的循环中调用一个API,这样我就不会达到速率限制。

import { doAsyncThing } from '../../../somewhere';

    export const myAsyncFunc = async () => {
      // An array of data
      const arrayData = await ['123', '456', '789'];
    
      for (const item of arrayData) {
        // Call an API
        await doAsyncThing(item);
        // Wait for 1 second
        await new Promise(resolve => setTimeout(resolve, 1000));
      }
    };

下面是我的测试代码

jest.mock('../../../somewhere');
jest.useFakeTimers();

test('a test', async () => {
  const funcPromise = myAsyncFunc();
  jest.runAllTimers();
  expect(myAsyncFunc).resolves.toBeUndefined();

  expect(doAsyncThing).toBeCalledTimes(2);
  expect(setTimeout).toBeCalledTimes(2);
});

然而,这不起作用并产生此结果

expect(jest.fn()).toBeCalledTimes(expected)

    Expected number of calls: 2
    Received number of calls: 0

      25 |   expect(myAsyncFunc).resolves.toBeUndefined();
      26 |
    > 27 |   expect(doAsyncThing).toBeCalledTimes(2);

我很确定我不能等待myAsyncFunc完成,因为jest.useFakeTimers会导致我手动提前计时器。但是,如果myAsyncFunc尚未完成,我如何提前计时器?
我对如何测试这个功能有点困惑

wh6knrhe

wh6knrhe1#

在启动计时器之后,等待结果不就行了吗?

jest.useFakeTimers();
test('a test', async () => {
  const funcPromise = myAsyncFunc();
  jest.runAllTimers();
  await funcPromise;
  expect(myAsyncFunc).resolves.toBeUndefined();

  expect(doAsyncThing).toBeCalledTimes(2);
  expect(setTimeout).toBeCalledTimes(2);
});
dphi5xsq

dphi5xsq2#

感谢Moa提供类似的问题
我已经设法修复了测试,以便等待promise,但是由于一些非常奇怪的原因,即使arrayData中只有3个元素,循环也必须运行5次
以下是更新后的测试:

import { myAsyncFunc } from '.';
import { doAsyncThing } from '../../../somewhere';

jest.mock('../../../somewhere');
jest.useFakeTimers();

test('a test', async () => {
  const funcPromise = myAsyncFunc();

  for (let i = 0; i < 5; i++) {
    jest.runAllTimers();
    await Promise.resolve();
  }

  expect(doAsyncThing).resolves.toBeUndefined();
  expect(myAsyncFunc).toBeCalledTimes(3);
});
eimct9ow

eimct9ow3#

函数toBeCalledTimes必须与mock函数一起使用,而不是真实的的函数!从你的例子中不清楚这个引用来自哪里。你能澄清一下吗?
我的猜测是你没有正确地模拟这个函数。

相关问题