Jest 测试时如何 mock 掉定时器?

阅读时长 4 分钟读完

在前端开发中,我们经常会使用定时器来实现一些操作,如定时轮询接口数据、定时刷新页面等。在进行单元测试时,我们需要保证测试用例的可靠性,即不受定时器的影响。因此,我们需要使用 Jest 的 mock 功能来模拟定时器,使得测试可以按照预期进行。

使用 jest.useFakeTimers()

Jest 提供了一个函数 jest.useFakeTimers(),来快速创建一个模拟的定时器环境。该函数接收一个参数表示模拟的时间值,单位为毫秒。使用该函数后,所有的 setTimeout() 和 setInterval() 函数都会被替换成模拟的函数,如 jest.runOnlyPendingTimers()。

示例代码如下:

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

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

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

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

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

上述代码中,我们使用 jest.useFakeTimers() 来创建一个模拟定时器环境。然后,我们使用 setTimeout() 来注册一个回调函数 callback,在 1000ms 后触发。接下来,我们使用 jest.advanceTimersByTime() 来将定时器向前推进 1000ms。最后,我们使用 expect() 来确认 callback 函数被调用。

使用 jest.spyOn()

在某些情况下,我们需要确保定时器函数仍然能够正常运行,但是需要避免它们在测试用例中造成影响。使用 jest.spyOn() 可以模拟定时器函数而不影响实际的执行。

示例代码如下:

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

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

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

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

上述代码中,我们使用 setInterval() 函数来注册一个回调函数 callback,在 1000ms 后触发。然后我们使用 clearInterval() 函数来停止定时器。使用 jest.spyOn() 可以模拟 setInterval() 函数,使得我们可以在测试用例中注册一个定时器来模拟回调函数的执行。

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

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

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

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

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

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

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

上述代码中,我们使用 jest.spyOn() 来模拟 setInterval() 函数,同时我们使用 mockReturnValue() 来指定 spy 函数返回值。然后,我们使用 setInterval() 函数来注册一个回调函数 callback,在 1000ms 后触发。接着,我们使用 jest.runOnlyPendingTimers() 来手动触发回调函数的执行。最后,我们使用 clearInterval() 函数来停止定时器,并使用 expect() 来确认回调函数被正常执行。

结语

在进行单元测试时,我们需要使用 Jest 的 mock 功能来模拟定时器,以保证测试用例的可靠性。以上介绍了两种实现方式,我们可以根据具体的测试情况选择适合的方式。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67cdafa0e46428fe9e75a01e

纠错
反馈