2017-11-22 2 views
0

아이들이 타이머를 시작하고 1 초 간격으로 남은 시간을 알려주는 Timer 구성 요소를 만들려고합니다.Jest : 가짜 setInterval이 예상대로 작동하지 않습니다.

Full Code

/* 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) 
 
})

Full Code

/* 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 가짜 타이머에 대해 오해 한 것이 있습니까?

고맙습니다 ❤️

답변

1

가짜 타이머에는 아무 것도 없습니다. initializeTimer에서 setInterval을 한 번만 호출 했으므로 setInterval.mock.calls.length는 1을 보여줍니다.하지만 콜백 함수는 필요한만큼 호출됩니다. for 루프로 생각해보십시오. 루프 선언 (이 경우에는 setInterval)과 필요에 따라 본체 호출 만 있습니다 (여기서 콜백 함수)

희망이 있습니다.

관련 문제