Jest.js 用于测试目的的pRetry函数中的模拟计时器

kadbb459  于 2023-03-27  发布在  Jest
关注(0)|答案(2)|浏览(150)

我想用Jest测试框架测试一个使用pRetry npm包的函数。我想加快测试流程,因此我不想等到pRetry实际计时器触发。为了简化任务,我想让我的测试运行时间小于500 ms,并打印//***行中的console.log消息7(或者8?)次。我试过使用jest.useFakeTimers,jest.runAllTimers和其他没有成功的方法。请帮助,我卡住了:)
我的函数看起来像:

myFunc() {
  return pRetry(async () => {
    if(Math.random() > 0.5){
      return true;
    }

    console.log(`currentTime: ${Date.now()}`); // ***

    throw new Error('Calculations failed....');
  }, {
    retries: 7,
    minTimeout: 500,
  });
}

我的测试看起来像:

it('should throw an error if calculations failed', async () => {
      await myFunc();

      expect(true).toBeTruthy();
    });
vfh0ocws

vfh0ocws1#

需要这个,但也找不到办法。
最后,我让pRetry的minTimeout从一个函数中获取它的值,这个函数是我在测试期间存根的(所以我导出了它)
大概是这样:

// used to be overwritten by testing
export const getMinTimeout = () => 1000;
await pRetry(
    async () => {
      return doRetry();
    },
    {
      minTimeout: exports.getMinTimeout(),
     
    }
sandbox.stub(ApiV2, 'getMinTimeout').returns(10);

这个很好用

8ehkhllq

8ehkhllq2#

我设法(非常简单地)使用Jest模拟p-retry:

jest.mock('p-retry', () => async (fn) => {
  const tryFn = async (attemptCount) => {
    try {
      return await fn(attemptCount)
    } catch (error) {
      await new Promise((resolve) => setTimeout(resolve, 1))
      return tryFn(attemptCount + 1)
    }
  }

  return tryFn(0)
})

相关问题