反应/酶测试-在模拟事件(异步还是同步?)后检索状态

时间:2019-08-06 18:53:04

标签: reactjs enzyme

我已经开始学习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()是否确实是异步的,如果是,那么测试这种代码的合适方法是什么?

谢谢!

0 个答案:

没有答案