2016-08-23 8 views
0

私のコンテナコンポーネントメソッドをテストしようとしています。私のコンテナには、すべての提案をロードして状態を設定する非同期メソッドがありました。例:だから、非同期テスト - MochaとChai - 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()は2つのことが起こるのだろう、(私は何が起こっているかだと思う)がエラーをスローした場合:

  • 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); 
関連する問題