2017-08-01 96 views
1

首先,我一直在尝试几乎所有的东西来使代码工作,并且我实现了,问题是我不喜欢这种方法,并且我想知道是否有更好的东西可以做,以使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') 
     } 
    } 
}; 

非常感谢你!

+2

'如果给定的代码会在functionToTest完成后运行断言?' - 你不能因为'functionToTest'既不返回任何东西,也不会在完成时回调任何东西......这是一个写得不好的异步功能 –

+0

@JaromandaX我完全同意你的观点,我正在处理的不是很好的ATM代码,但不知何故,有人必须维护它:(和问题是,“你不能改变的东西,除非你可以验证没有任何行为改变“,这只能通过测试来完成(即使测试是丑陋的并且几乎是不可能的) –

+0

你不能在不改变代码的情况下测试它,你说你不能,所以不要测试它,不是一个好的答案,而是唯一合法的答案如果api调用会产生有状态的变化,您可以轮询以确定变化是否在promise循环中生效,并且如果测试的结果超过n毫秒,这也不是很好,但你卡住了。 –

回答

0

在尝试了几件事情之后,你总是可以做,是模仿第一API调用,所以在最后,而不是异步叫你将有一个同步一个感谢回调,我将离开这里举一个例子,对于那些在测试未返回的承诺时需要灵感的人。

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

PS:再一次,这个解决方案不是最漂亮的,但它至少起作用。

0

不能检查第二个API CA我们会直接发生,除非Promise被退回。

如下所述:

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

没有返回无极所以没有什么可以做这件事恕我直言。

嘲笑这个函数在这里我没有用。

如果您不能直接测试它,可以尝试间接测试它:即使它很糟糕,您也可以通过API检查函数是否正在调用,API后面的资源状态已按预期更改第二个电话。 如果您无法通过API进行很好的测试......那就没什么可测试的了。