2016-01-22 16 views
5

ich ein Beispiel hier bin ändern:React Testen Komponente mit Enzyme ändern prop

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">'. 

Sie aus dem Ergebnis des Tests sehen, dass das Attribut classname korrekt auf prop Änderung aktualisiert wurde. Der Wert der Eingabe bleibt jedoch falsch auf 'foo' eingestellt.

Irgendwelche Ideen, wie ich diesen Wert geltend machen kann, wurde auf der Komponente richtig geändert, die neue Stützen zu einem Wertattribut auf einer Eingabe empfängt?

Antwort

7

Sie müssen eine Methode .update() auf einem Wrapper aufrufen. (Gleich nachdem Sie neue Requisiten eingestellt haben) Dies erzwingt die Aktualisierung der Komponente und der Wert der Eingabe sollte sich ändern.

Sie können mehr darüber lesen Sie hier: http://airbnb.io/enzyme/docs/api/ShallowWrapper/update.html

+0

einfach eine Anmerkung, die OP ist mit mount, nicht flach, so dass die richtigen Dokumente sollten http://airbnb.io/enzyme/docs/api/ReactWrapper /update.html; Eine weitere Anmerkung ist, dass setProp für mount ein zweites Callback-Argument benötigt, das ausgeführt wird, nachdem die Operation abgeschlossen wurde: 'setProps (someProps, callback)' (ref: http://airbnb.io/enzym/docs/api/ReactWrapper/ setProps.html) – nbkhope