首先,我已经尝试了几乎所有事情来使这个代码工作,我实现了,问题是我不喜欢这种方法,我想知道是否有更好的东西我可以这样做,以使TEST代码更具可读性,但功能更强。
我想断言(例如sinon
)第二个函数(secondApiCall
)已被调用,但似乎没有办法实现这一目标,你将如何实现这一目标。这是一种非hacky方法吗?
这里的主要问题是"我无法修改functionToTest
"我必须编写基本上检查API调用正在进行的测试。
在functionToTest
完成后,您将如何使用给定的代码运行断言?
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')
}
}
};
非常感谢!
答案 0 :(得分:0)
除非返回Promise,否则无法检查第二次API调用是否直接发生。
如下所述:
const functionToTest = () => {
setTimeout(() => {
firstApiCall().then(result => {
setTimeout(() => {
secondApiCall()
}, 2)
})
}, 15)
};
承诺不归还,所以你无能为力恕我直言。
在这里嘲笑这个功能我没用。
如果你不能直接测试它,你可以尝试间接测试它:即使它非常糟糕,你可以通过函数调用的API检查,API背后的资源状态已经改变如第二次通话后的预期。 如果你不能通过API进行测试......那么就没有什么可以测试的了。
答案 1 :(得分:0)
在尝试了几件事之后,您可以随时执行的操作是模拟第一个API调用,因此在结束而不是异步调用时,您将拥有同步一个感谢回调,我将留下一个例子,为那些在测试未返回的承诺时需要灵感的人。
const firstApiCall = () => {
return {
then: (callback) => {
callback('firstApiCall success');
}
}
};
PS:再一次,这个解决方案不是最漂亮的,但至少可以起作用。