用酶反应测试组分改变

Dan*_*ham 7 javascript jasmine reactjs reactjs-testutils enzyme

我正在修改这里找到的一个例子:

https://github.com/airbnb/enzyme/blob/master/docs/api/ReactWrapper/setProps.md

class Foo extends React.Component {
    render() {
        return (
            <input className={this.props.name} type="text" value={this.props.name} onChange={()=>{}} />
        );
    }
}

it('should pass and does not', ()=> {
    const wrapper = mount(<Foo name="foo" />);
    expect(wrapper.find('.foo').html()).toBe(`<input class="foo" type="text" value="foo">`);
    wrapper.setProps({ name: 'bar' });
    expect(wrapper.find('.bar').html()).toBe(`<input class="bar" type="text" value="bar">`);
});

Result: Expected '<input class="bar" type="text" value="foo">' to be '<input class="bar" type="text" value="bar">'.
Run Code Online (Sandbox Code Playgroud)

您可以从测试结果中看到className属性在prop更改时已正确更新.但输入的值仍然错误地设置为'foo'.

关于如何断言该值的任何想法已经在接收新道具的组件上正确地更改为输入的值属性?

小智 6

你必须.update()在包装器上调用一个方法.(在你设置新的道具之后)这将强制更新组件,输入的值应该改变.

你可以在这里阅读更多相关信息:http://airbnb.io/enzyme/docs/api/ShallowWrapper/update.html

  • 请注意,OP 使用的是 mount,而不是浅层,所以正确的文档应该是 http://airbnb.io/enzyme/docs/api/ReactWrapper/update.html ;另一个注意事项是,挂载的 setProp 需要第二个回调参数,该参数在操作完成后执行:`setProps(someProps, callback)`(参考:http://airbnb.io/enzyme/docs/api/ReactWrapper/ setProps.html) (4认同)