2016-11-03 2 views
2

У меня проблема с пониманием мелкой рендеринга фермента.Проверка реквизита дочернего компонента с мелким рендерингом с использованием фермента

У меня есть компонент WeatherApplication который имеет дочерний компонент CitySelection. CitySelection получает объект selectedCity, который удерживается в состоянии WeatherApplication s.

Компонент:

export default class WeatherApplication extends React.Component { 

    constructor(props) { 
     super(props); 
     this.state = { 
      city : "Hamburg" 
     } 
    } 

    selectCity(value) { 
     this.setState({ 
      city: value 
     }); 
    } 

    render() { 
     return (
      <div> 
       <CitySelection selectCity={this.selectCity.bind(this)} selectedCity={this.state.city} /> 
      </div> 
     ); 
    } 
} 

Я тестировал sussessfully что CitySeleciton существует и что selectedCity является «Гамбург» и правильной функции передается.

Теперь я хочу проверить поведение метода selectCity.

it("updates the temperature when the city is changed",() => { 
    var wrapper = shallow(<WeatherApplication/>); 
    wrapper.instance().selectCity("Bremen"); 

    var citySelection = wrapper.find(CitySelection); 
    expect(citySelection.props().selectedCity).toEqual("Bremen"); 

}); 

Этот тест не удается, так как значение citySelection.props().selectedCity еще Hamburg.

Я проверил, что снова вызван метод renderWeatherApplication, и this.state.city имеет правильное значение. Но я не могу получить его через реквизит.

ответ

1

Вызов wrapper.update() после selectCity() должен сделать трюк:

it("updates the temperature when the city is changed",() => { 
    var wrapper = shallow(<WeatherApplication/>); 
    wrapper.instance().selectCity("Bremen"); 
    wrapper.update(); 
    var citySelection = wrapper.find(CitySelection); 
    expect(citySelection.props().selectedCity).toEqual("Bremen");  
}); 
+0

Большое спасибо, это работает! Что я действительно не понимаю, почему я должен это назвать. Не следует ли перекомпоновать компонент при изменении состояния (даже при его мелкомасштабном рендеринге)? – Ria

+0

Я думаю нет. Я думаю, если вы обновите состояние с помощью события «click» или так, то оно должно. PS: Великий, чтобы помочь вам! –

 Смежные вопросы

  • Нет связанных вопросов^_^