如何testing在testing函数中没有返回的被调用的promise

首先,我一直在尝试几乎所有的东西来使这个代码工作,我取得了成功,问题是我不喜欢这种方法,我想知道是否有更好的东西,我可以做,以便使testing代码更具可读性,但function。

我想断言 (举例来说secondApiCall )已经调用了第二个函数( secondApiCall ,但似乎没有办法做到这一点,你会怎么做呢。 这是否有一个非hacky方法?

这里的主要问题是“我不能修改functionToTest ”,我必须编写testing,基本上检查API调用正在完成。

如何使用给定的代码在functionToTest完成后运行断言?

PS:代码是狗屎,我知道,但有时你只需要处理它,你不能再做更多的感谢只是在重构之前testing它的狗屎它:(

 const firstApiCall = () => { return new Promise(function(resolve,reject) { setTimeout(() => { resolve('firstApiCall success'); }, 3); }); }; const secondApiCall = () => { return new Promise(function(resolve,reject) { setTimeout(() => { resolve('secondApiCall success'); }, 3); }); }; const functionToTest = () => { setTimeout(() => { firstApiCall().then(result => { setTimeout(() => { secondApiCall() }, 2) }) }, 15) }; 

基本上生成模拟的代码是这样的,所以最后你有同步代码

 const firstApiCall = () => { return { then: (cb) => { cb('firstApiCall success') } } }; 

非常感谢你!

除非返回Promise,否则不能检查第二个API调用是否直接发生。

如此处所述:

 const functionToTest = () => { setTimeout(() => { firstApiCall().then(result => { setTimeout(() => { secondApiCall() }, 2) }) }, 15) }; 

该承诺不归还,所以没有什么可以做的恕我直言。

嘲笑这个function在这里我没有用。

如果你不能直接testing它,你可以尝试间接地testing它:即使它很糟糕,你也可以通过API检查函数是否正在调用,API后面的资源状态在第二次调用后如期改变。 如果你不能通过API来testing,那么就没有太多的testing了。

在尝试了几件事情之后,你总是可以做的就是模拟第一个API调用,所以最后不是asynchronous调用,而是通过callback来实现同步 ,我会在这里留下一个例子,当testing承诺没有返回。

 const firstApiCall = () => { return { then: (callback) => { callback('firstApiCall success'); } } }; 

PS:再一次,这个解决scheme不是最漂亮的,但至less起作用。