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