![](/img/trans.png)
[英]Jasmine test: how to call through function that is called in tested function?
[英]How to test called promises not returned in tested function
首先,我一直在尝试使该代码正常工作的所有方法,但我实现了,问题是我不喜欢这种方法,并且我想知道是否有可以做的更好的方法TEST代码更具可读性,但功能强大。
我想断言 (与sinon
为例),第二功能( secondApiCall
)被调用 ,但似乎没有办法做到这一点,你将如何做到这一点。 是否有非骇人听闻的方法?
这里的主要问题是“我无法修改functionToTest
”,并且我必须编写测试,这些测试基本上可以检查API调用是否已完成。
在functionToTest
完成后,如何使用给定的代码运行断言?
PS:代码很糟糕,我知道,但是有时候您只需要处理它,就不能做更多的事情了,谢谢,只是在重构之前测试一下它::(
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')
}
}
};
非常感谢你!
您不能检查第二个API调用是否确实直接发生,除非返回了Promise。
如此处所述:
const functionToTest = () => {
setTimeout(() => {
firstApiCall().then(result => {
setTimeout(() => {
secondApiCall()
}, 2)
})
}, 15)
};
Promise不会退还,所以恕我直言,您对此无能为力。
我要说的是模拟功能。
如果您不能直接对其进行测试,则可以尝试进行间接测试:即使它非常糟糕,您也可以通过API来检查该函数正在调用,该API背后的资源状态在第二次调用之后已按预期进行了更改。 如果您不能很好地通过API进行测试...那么就没什么要测试的了。
在尝试了几件事之后,您始终可以做的是模拟第一个API调用,因此最后,由于有了回调,您将获得一个同步,而不是一个异步调用,这里我给大家留下一个例子,当测试未返回的承诺时。
const firstApiCall = () => {
return {
then: (callback) => {
callback('firstApiCall success');
}
}
};
PS:同样,此解决方案不是最漂亮,但至少可以起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.