Jest 是否会在每个测试用例后自动恢复真实计时器?

问题描述 投票:0回答:1

使用 Jest 和 Enzyme 在 React 中进行测试。 对于反应组件内的一个函数,我使用 setTimeOut 来更改状态。

现在为了在 jest 中测试该函数,我使用 jest.useFakeTimer。 仅将其用于一个 it() ,如下所示 -

  it('resets text after 2 seconds', async () => {
    jest.useFakeTimers();
    ......

    .....

    jest.advanceTimersByTime(2000);
    wrapped.update();

    expect(....).toBe('Data');
  });

现在我需要在这个测试用例中使用 jest.useRealTimers() 吗? 由于 Jest 在每个测试用例结束后都会自动恢复真实计时器,所以一般情况下我们不需要手动调用 jest.useRealTimers() 来恢复原始计时器功能。

正确吗?

如果我在此之后再添加一项测试,例如 -

it('test time out', () => {
    console.log(setTimeout);
}); 

它不会打印模拟版本。

那么我需要在这里使用 jest.useRealTimers() 吗?我很困惑。

javascript reactjs jestjs settimeout enzyme
1个回答
0
投票

Fake Timers API 文档解释清楚:

调用

jest.useFakeTimers()

 将为文件中的所有测试使用假计时器,直到使用 
jest.useRealTimers()
 恢复原始计时器

是的,您需要致电

jest.useRealTimers()

您可以从任何地方调用

jest.useFakeTimers()

jest.useRealTimers()
:顶层、测试块内等。请记住,这是一个全局操作,会影响同一文件中的其他测试。

您还可以查看

useFakeTimers()useRealTimers() 的源代码

他们在

global

 对象上设置真实计时器和假计时器。

假的

setTimeout

不是一个模拟函数(可以通过
jest.isMockFunction()
检查),它是一个通用函数,不是由
jest.fn()
创建的,请参阅
_fakeSetTimeout()
的源代码

© www.soinside.com 2019 - 2024. All rights reserved.