2016-08-23 164 views
0

我想測試我的容器組件方法。我的容器有一個異步方法,用於加載所有提議並設置爲狀態。例如:異步測試 - 摩卡和柴 - 確保done()回調被稱爲

loadProposal(proposalId) { 
    return axios 
      .get("http://localhost:9292/api/proposal_drafts/1.json") 
      .then(response => { 
       this.setState({ 
       proposal: Immutable.fromJS(response.data) 
       }) 
      }) 
    } 

因此,要測試此方法,我得到組件實例並調用方法(api url被模擬)。

it("sets proposal in the state", (done) => { 
    const wrapper = shallow(<Container/>) 

    loadProposalRequest(1) 

    wrapper.instance().loadProposal(1).then(() => { 
     chai.expect(wrapper.state().proposal).to.be(Map) 
     done() 
    }) 
    }) 

,但我得到這個錯誤,從控制檯:

Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.

行動:如果我把一個的console.log(wrapper.state())內則()。日誌正確顯示我的狀態。

回答

0

如果chai.expect()拋出一個錯誤(我認爲這是發生了什麼事),會發生兩兩件事:

  • done將不會被調用,因爲拋出的錯誤;
  • 錯誤不會被捕獲,因爲沒有額外的錯誤處理。

您應該使用摩卡的承諾支持,而不是刪除這兩個問題:

it("sets proposal in the state",() => { 
    const wrapper = shallow(<Container/>) 

    loadProposalRequest(1) 

    return wrapper.instance().loadProposal(1).then(() => { 
    chai.expect(wrapper.state().proposal).to.be(Map) 
    }) 
}) 
0

您還可以使用chai-as-promised

您可以編寫代碼,表示你真正的意思是:

return doSomethingAsync().should.eventually.equal("foo"); 

或者如果您遇到return不適合的情況(例如樣式考慮)或不可行le(例如測試框架不允許返回異步測試完成信號),那麼您可以使用以下解決方法(其中done()由測試框架提供):

doSomethingAsync().should.eventually.equal("foo").notify(done);