【发布时间】:2017-09-27 19:47:55
【问题描述】:
我的组件中有以下功能:
method(args) {
fetch(args)
.then((response) => {
this.setState({
element: response
error: false
});
})
.catch((error) => {
this.setState({
error: true
});
});
}
我正在尝试为它编写一个单元测试,因此我使用带有自定义响应的 fetch-mock 模拟了 fetch 调用。我想检查调用此方法时状态是否已更新并且它似乎不起作用。我正在使用酶、期望和 sinon,并且在设置 component.setState = sinon.spy 或将其存根时未能成功调用间谍。如何检查是否使用某些元素调用了 setState,或者我的单元测试方法是否错误?
【问题讨论】:
-
如果您使用酶,您可以只获取组件的状态,为什么需要存根 setState 函数?为什么检查状态还不够?话虽如此,你可以嘲笑它,@ 987654322@。假设
component = (shallow||render)(<Component>)应该这样做 -
状态是异步更新的,所以当我检查它时,它还不等于正确的值。我尝试了以下方法:` const setStateSpy = sinon.spy();`
const component = shallow(<Main {...props} />);main.instance().setState = setStateSpy;expect(setStateSpy.called).toBe(true);但这返回错误。 -
您刚刚告诉我状态是异步更新的,如果您无法检查状态的值,您将无法检查是否调用了 setState。同样的原因也适用。如果是异步操作,您需要模拟异步操作或根据异步操作本身的性质设置超时。
-
我确实模拟了异步操作,但 setState 方法也是每个反应的异步操作。我确实可以通过超时解决它,但这似乎是一个 hacky 解决方案,这就是我想监视 setState 方法的原因。
标签: unit-testing reactjs sinon enzyme