我已经开始学习React / Enzyme,并且对测试中setState()的行为有疑问。
我了解,出于性能原因,setState()有时可以异步。 但是,我已经看到了几个类似以下的示例:
function validation() {
var numInput = +document.getElementsByTagName("input")[0].value;
var select = document.getElementsByTagName("select")[0].selectedIndex == "0";
if(numInput < 0 || numInput === 0 || isNaN(numInput) && select) {
如您所见,调用class Foo extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
render() {
const { count } = this.state;
return (
<div>
<div className={`clicks-${count}`}>
{count} clicks
</div>
<a href="url" onClick={() => { this.setState({ count: count + 1 }); }}>
Increment
</a>
</div>
);
}
}
const wrapper = shallow(<Foo />);
wrapper.find('a').simulate('click');
expect(wrapper.state().count).to.equal(1);
具有执行simulate('click')
的效果。此后,立即检索状态,然后进行比较。
我已经测试了类似的示例,并且它们似乎可以正常工作,但是this.setState({ count: count + 1 })
是否异步,然后比较中的setState()
调用不能给出期望的结果呢? / p>
我不知道,也许wrapper.state()是异步的,但我不这么认为。
我还阅读了以下讨论:setState calls within simulate events (async or not?)
推荐的解决方案是使每个事件处理程序都返回一个Promise,但是对此我不确定,我还没有看到在我研究过的任何示例中都可以使用此方法。甚至Enzyme网站上的示例也没有实现此解决方案。
所以我的问题是wrapper.state()
是否确实是异步的,如果是,那么测试这种代码的合适方法是什么?
谢谢!