【发布时间】:2018-07-25 19:26:26
【问题描述】:
我的 componentDidMount 中有一个动作,它在 30000 毫秒后从 Reddit 获取图像。我想测试这个但无法弄清楚?!?!有什么建议吗?
componentDidMount() {
this.getHumorEvery(30000)
}
getHumorEvery = async (ms) => {
await this.props.getHumor()
return setInterval(() => {
this.props.getHumor()
}, ms)
所以 getHumor() 立即被调用。然后在 30000 毫秒后再次调用它,依此类推。
那么我的测试...
it('should refetch images every 30000 ms', () => {
const clock = sinon.useFakeTimers();
const getHumorSpy = sinon.spy();
renderComponent(requiredProps({ getHumor: getHumorSpy }));
clock.tick(30000)
sinon.assert.calledTwice(getHumorSpy)
})
测试失败,因为 getHumor 只被调用一次。 setInterval() 永远不会被解雇?
【问题讨论】:
-
你的 setInterval 回调是否被调用过?如果是,
this.props.getHumor是在回调中定义的吗,你确定是sinon spy吗? -
是的,如果您在调用 setInterval 之前使用 console.log(setInterval),然后将另一个 console.log() 放入 setTimeout 中,然后运行测试,结果是...... 1) setInterval 注销已存根的 setInterval 2) setInterval 中的 console.log() 永远不会被注销因此,似乎是的,setInterval 已正确存根,但它从未调用 setInerval()
-
您是否尝试将刻度增加到更高的值,例如
40000? -
我做了..我尝试了几次。
-
为什么
getHumorEvery()中需要async/await?我认为这就是原因。
标签: reactjs setinterval sinon