作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
//Component
import _ from 'lodash';
constructor(props) {
super(props);
this.onScroll = _.debounce(::this.onScroll, 100);
}
onScroll() {
//some code
}
//Test
it('onScroll', () => {
const component = shallow(<Component />);
component.instance().onScroll(); //Dosn't call method
})
我使用 enzyme 作为渲染组件,使用 lodash 来消除抖动。如何调用component.instance().onScroll()
?
最佳答案
TL;博士;使用 lolex
及时推进while mocking timers用于测试_.debounce
我准备通过 useFakeTimers
来描述几种用 Jest 来模拟计时器的方法。和advanceTimersByTime
。但没有成功。
一段时间后,我发现它适用于 _.throttle
但不是_.debounce
。然后我发现issue reported在 Jest 的仓库中。还有专门的错误报告"_.debounce breaks fake timers"我没有看到它已解决(忽略其状态并检查那里的最后评论)。
根据 veeeery detailed explanation _.debounce
不只是把setTimeout
还要检查时差。所以我们也应该模拟 Date.now
那个 Jest 的jest.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
关于reactjs - 在 React with Enzyme 中测试去抖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48787824/
我是一名优秀的程序员,十分优秀!