Jest 单元测试中如何 Mock 掉定时器 setTimeout/setInterval?

在前端开发中,我们经常需要使用定时器来处理一些异步操作,例如延迟执行、轮询等。但在编写单元测试时,由于定时器是异步的,会导致测试结果不稳定。因此,我们需要在 Jest 单元测试中 Mock 掉定时器 setTimeout/setInterval。

Mock 定时器

在 Jest 中,我们可以通过 Mock 定时器来模拟定时器的行为,从而使单元测试变得更加可控。具体来说,我们可以使用 jest.useFakeTimers() 方法来 Mock 掉定时器,然后使用 jest.runAllTimers() 方法来立即执行所有定时器的回调函数。

下面是一个示例代码:

---------- ------------ -- -- -
  ---------------------
  ----- -------- - ----------
  -------------------- ------
  ----------------------------------
  --------------------
  ------------------------------
---

在上面的代码中,我们首先使用 jest.useFakeTimers() 方法来 Mock 掉定时器,然后使用 setTimeout() 方法创建了一个延迟 1 秒执行的回调函数。接着,我们使用 expect(callback).not.toBeCalled() 方法来断言回调函数未被调用。最后,我们使用 jest.runAllTimers() 方法来立即执行所有定时器的回调函数,然后使用 expect(callback).toBeCalled() 方法来断言回调函数已被调用。

类似地,我们也可以使用 setInterval() 方法来创建一个间隔一定时间执行的回调函数,并使用 jest.useFakeTimers()jest.runAllTimers() 方法来 Mock 掉定时器。

Mock 定时器的参数

除了 Mock 定时器本身的行为外,我们还可以通过 Mock 定时器的参数来模拟不同的场景,例如延迟时间、回调函数等。

下面是一个示例代码:

---------- ---------- ---- ----------- -- -- -
  ---------------------
  ----- -------- - ----------
  -------------------- ----- -------- ---------
  --------------------
  ---------------------------------------------- ---------
---

在上面的代码中,我们使用 setTimeout() 方法创建了一个延迟 1 秒执行的回调函数,并传入了两个参数。接着,我们使用 jest.runAllTimers() 方法来立即执行所有定时器的回调函数,然后使用 expect(callback).toHaveBeenCalledWith('hello', 'world') 方法来断言回调函数被调用时传入的参数。

总结

在 Jest 单元测试中,Mock 掉定时器 setTimeout/setInterval 是非常重要的。通过 Mock 定时器,我们可以模拟不同的场景,使单元测试变得更加可控。在实际开发中,我们应该充分利用 Jest 提供的 Mock 定时器功能,编写高质量的单元测试。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65d98d3f1886fbafa471154f