testing一个then()块内的代码

所以我使用React和Mocha / Chai / Enzyme / Sinon进行testing。 我有很多asynchronous调用在我的组件,我想testing后来的代码,但不知道如何。

所以例如这是我的AddToCart组件内的reserveSession()方法:

reserveSession() { this.props.reserveExam(id).then((json) => { // Code I want to test }).catch(...); } 

这是我testing的当前设置:

 describe('AddToCartButton', () => { beforeEach(() => { props = { // set all props to empty or () => null } wrapper = mount(<AddToCartButton {...props} />) }); }); 

所以我发现到目前为止,当我嘲笑this.props.reserveExam在每个之前,因为它不曾调用实际的function,它永远不会调用当时的代码,但如果我只是调用该方法不明白那是什么。 任何想法如何testing? 谢谢!

正如它写的那样,在unit testing中隔离你的处理器是非常困难的。 正如你所看到的,不得不直接通过承诺API来间接调用你的代码是一个痛苦。 随着项目的增长和承诺变得越来越复杂,维护成本将不断增加。

如果您试图testing承诺链的第5步,该怎么办? 你必须在第五步之前把所有的处理程序剔除掉?

通过在承诺链之外定义处理程序,可以创build一个更加独立的testing:

 var iExist = (json) => { dostuff(); } reserveSession() { this.props.reserveExam(id).then( iExist ).catch(...); } 

现在看看直接testing你的方法是多么微不足道!


当然,在某种程度上,这将是很好的行使你的承诺代码。 但是应该只需要一两个testing来确保一切正确连接,或者可以间接做端到端/functiontesting。

如果你熟悉存根,你可以保留一个variables'props'的属性,所以当调用函数reserveExam时,你强迫返回一个解决了json_data的promise。

 let json_data = {..custom data}; let stubed = sinon.stub(props,'reserveExam').callsFake(function(){ return Promise.resolve(json_data); });