2016-08-23 133 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);