我正在尝试创建一个Timer组件,它允许孩子启动计时器,然后以1秒的间隔为他们提供剩余的时间。
我有以下测试:
/* Test */
jest.useFakeTimers()
it.only('should update the reamining time every second', () => {
const time = 1/12
const wrapper = shallow(<Timer time={time} />)
wrapper.find('.start').simulate('click')
jest.runAllTimers()
expect(setInterval.mock.calls.length).toBe(4)
})
/* Code */
updateTimeLeft() {
const now: number = +new Date()
const timeLeft = this.state.endTime - now
if (timeLeft < 0) {
clearInterval(this.state.timeInterval)
}
this.setState({ timeLeft })
}
intializeTimer(minutes: number) {
const startTime: number = new Date().getTime()
const endTime: number = new Date(startTime + minutes * 60 * 1000).getTime()
this.setState({
startTime,
endTime
})
const timeInterval: NodeJS.Timer = global.setInterval(
() => this.updateTimeLeft(),
1000
)
this.setState({ timeInterval })
}
代码有效。在测试中,问题是setInteval.mock.calls.length = 1
,无论如何。
我对Jest假定时器有什么误解吗?
谢谢❤️
答案 0 :(得分:1)
假定时器没什么。 你只在initializeTimer中调用了一次setInterval,这就是setInterval.mock.calls.length给你看的原因1.但是它的回调函数会根据你的需要调用。 把它想象为循环,你只有一个for循环声明(在这种情况下我们的setInterval),以及你需要的身体调用(这里我们的回调函数)
希望,这有帮助。