如何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起作用。