TL; 博士; 用于在模拟计时器进行测试lolex
时及时推进_.debounce
我已经准备好描述几种用 jest byuseFakeTimers
和来模拟计时器的方法advanceTimersByTime
。但它没有用。
一段时间后,我发现它适用于_.throttle
但不适用于_.debounce
. 然后我发现Jest 的 repo 中报告了问题。还有专门的错误报告“_.debounce 打破了假计时器”,我没有看到它已经解决(忽略它的状态并检查那里的最后评论)。
根据 veeeeeery 的详细解释 _.debounce
不仅可以放setTimeout
而且还可以检查时差。所以我们也应该嘲笑Date.now
Jestjest.runOnlyPendingTimers
或jest.advanceTimersByTime
不这样做。
所以对于简单的组件,如
function Debounced({onClick}) {
return <button onClick={_debounce(onClick,500)}>Click Me</button>;
}
下一个测试已通过:
let clock = lolex.install();
const onClick = jest.fn();
const wrapper = shallow(<Debounced onClick={onClick} />);
const button = wrapper.find('button').at(0);
button.simulate('click');
button.simulate('click');
button.simulate('click');
clock.tick(510);
expect(onClick).toHaveBeenCalledTimes(1);
clock.uninstall();
PS 确定你可以运行lolex.install()
并clock.uninstall()
在beforeEach
/afterEach