2017-01-23 73 views
1

我想用酶測試我的React組件。該組件具有這種渲染方法:在酶不能更新狀態使用實例()。狀態和更新()

render() { 
     let modal = null; 
     let modalTitle = this.state.isEditing ? 'Edit Event' : 'Add Event'; 
     if (this.state.showModal) { 
      modal = (<div className="event-modal"> 
       <Modal show={this.state.showModal} onHide={this.closeModal}> 
        ... 
       </Modal> 
      </div>); 
     } 
     return (
      <div style={{height: '500px', width: '1000px'}}> 
       <BigCalendar 
        events={this.props.events} 
        startAccessor='startDate' 
        endAccessor='endDate' 
        onSelectSlot={this.onDayClick} 
        selectable={true} 
        onSelectEvent={this.onEventClick} 
       /> 
       {modal} 
      </div> 
     ); 
    } 

在我的測試情況下,我想驗證模式時顯示的ShowModal = true,並且酶建議您使用實例()來獲取您的組件中進行詳細正確的狀態測試,所以我嘗試使用實例(),然後更新(),但它沒有奏效。我最後工作的測試用例是使用setState(),如果可能,酶建議不要使用。這是我的測試案例:

it('render should display modal if showModal is true',() => { 
     const calendar = shallow(<CalendarPres events={[]}/>); 
     //The commented out code does not work, but I'm not sure why 
     //calendar.instance().state.showModal = true; 
     //calendar.update(); 
     calendar.setState({showModal: true}); 
     expect(calendar.find('.event-modal').exists()).toBe(true); 
    }); 

的setState()的作品,但使用實例(),然後更新()沒有。爲什麼update()不能正確地重新渲染我的組件?

+0

爲的setState(),在那裏他們建議您使用實例()的酶文檔: https://github.com/airbnb/enzyme/blob/master/docs/api/ShallowWrapper/setState.md 酶文檔例如:http://airbnb.io/enzyme/docs/api/ShallowWrapper/instance.html –

+0

感謝您的補充。 – prosti

回答

0

酶建議像你說的,但是這不會這麼好

calendar.instance().state.showModal = true; 

從何時起,我們應該直接設置狀態會在組件構造的唯一情況。

我們應該始終使用setState()設置狀態時異步工作。


here:如果有什麼更新12


update()方法纔有效。看起來狀態在update()火災時刻沒有改變。

+0

謝謝,我以爲什麼時候酶會說使用實例()來設置它們直接指向的狀態,並且他們可以以某種方式掛接到組件上以使其工作。我將來會使用setState()。 –

+0

沒問題,保持良好的工作。 – prosti