异步测试 - Mocha和Chai - 确保调用done()回调

时间:2016-08-23 14:00:17

标签: asynchronous reactjs mocha chai

我正在尝试测试我的容器组件方法。我的容器有一个异步方法,可以加载所有提案并设置为状态。例如:

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()
    })
  })

但我从控制台收到此错误:

  

错误:超过2000毫秒的超时。确保正在进行done()回调   在这个测试中调用。

Ops:如果我在then()中放入console.log(wrapper.state())。日志正确显示我的状态。

2 个答案:

答案 0 :(得分:1)

如果chai.expect()抛出错误(我认为正在发生的事情),将会发生两件事:

    由于抛出错误,
  • done将不会被调用;
  • 错误不会被捕获,因为没有其他错误处理。

您应该使用Mocha的承诺支持来删除这两个问题:

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)
  })
})

答案 1 :(得分:0)

您也可以使用chai-as-promised

你可以编写表达你真正意思的代码:

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

或者如果您遇到return不可取的情况(例如样式考虑因素)或不可能(例如测试框架不允许返回承诺以指示异步测试完成),那么您可以使用以下解决方法(测试框架提供done()):

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