首先,我一直在尝试几乎所有的东西来使代码工作,并且我实现了,问题是我不喜欢这种方法,并且我想知道是否有更好的东西可以做,以使TEST代码更具可读性,但功能性更强。如何测试在测试函数中未返回的被调用的承诺
我想断言(与sinon
为例)第二函数(secondApiCall
)被称为,但似乎没有办法做到这一点,你将如何做到这一点。它是否存在一个非hacky方法?
这里的主要问题是“我不能修改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')
}
}
};
非常感谢你!
'如果给定的代码会在functionToTest完成后运行断言?' - 你不能因为'functionToTest'既不返回任何东西,也不会在完成时回调任何东西......这是一个写得不好的异步功能 –
@JaromandaX我完全同意你的观点,我正在处理的不是很好的ATM代码,但不知何故,有人必须维护它:(和问题是,“你不能改变的东西,除非你可以验证没有任何行为改变“,这只能通过测试来完成(即使测试是丑陋的并且几乎是不可能的) –
你不能在不改变代码的情况下测试它,你说你不能,所以不要测试它,不是一个好的答案,而是唯一合法的答案如果api调用会产生有状态的变化,您可以轮询以确定变化是否在promise循环中生效,并且如果测试的结果超过n毫秒,这也不是很好,但你卡住了。 –