使用 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() 吗?我很困惑。
Fake Timers API 文档解释清楚:
调用是的,您需要致电
jest.useFakeTimers()
将为文件中的所有测试使用假计时器,直到使用jest.useRealTimers()
恢复原始计时器
jest.useRealTimers()
。
您可以从任何地方调用您还可以查看
jest.useFakeTimers()
或jest.useRealTimers()
:顶层、测试块内等。请记住,这是一个全局操作,会影响同一文件中的其他测试。
useFakeTimers() 和 useRealTimers() 的源代码
他们在global
对象上设置真实计时器和假计时器。假的
setTimeout
不是一个模拟函数(可以通过
jest.isMockFunction()
检查),它是一个通用函数,不是由jest.fn()
创建的,请参阅
_fakeSetTimeout()
的源代码