我不明白为什么在使用jest. runAllTimers后,在我的单元测试中没有调用传递给setTimeout的回调。调用了useEffect,但没有调用超时回调,也没有根据Istanbul代码覆盖率报告进行覆盖。
实现方式大致如下:
React组件:
const MyComponent = () => {
const [timer, setTimer] = useState(5);
useEffect(() => {
const timeout = setTimeout(() => {
console.log('***** Timer Ran!!! *********');
if(timer <= 5 && timer > 0) setTimer(timer - 1);
else {
return () => clearTimeout(timeout);
}
}, 1000);
}, [timer]);
<>
// some JSX
</>
};
试验:
jest.useFakeTimers(); // at top of file
it('should run code inside useEffect', () => {
const startBtn = screen.getByTestId('start-btn');
expect(startBtn).toBeEnabled();
// more code
jest.runAllTimers();
});
注意:我试过在waitFor和act中 Package jest.runAllTimers
,但没有效果。
1条答案
按热度按时间2guxujil1#
当我用
act
Package 组件的呈现时,我的问题得到了解决。样本代码: