我正在尝试测试我的容器组件方法。我的容器有一个异步方法,可以加载所有提案并设置为状态。例如:
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())。日志正确显示我的状态。
答案 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);