2017-01-02 133 views
2

我想测试一个递归函数,它重试输入函数直到它成功(返回true)。如何对自己调用的函数进行单元测试

  1. 调用一个承诺,并等待其完成
  2. 如果返回值是正的,停止。否则,在减少重试计数的同时重试。

下面是实现:

type booleanPromiseFunc = (...args) => Promise<boolean>; 

export async function retryIfFails(func: booleanPromiseFunc, retryCount: number) 
{ 
    let result = await func(); 

    if (result) 
     return; 

    if (retryCount == 0) 
     return; 

    setTimeout(retryIfFails, 1000, func, retryCount - 1); 
} 

使用单元测试兴农假定时器:

it.only('Test', function() { 

    let func = sinon.stub(); 
    func.returns(Promise.resolve(false)); 

    Utils.retryIfFails(func, 2); 

    chai.expect(func.callCount).eq(1); 
    clock.tick(1001); 
    chai.expect(func.callCount).eq(2); 
    clock.tick(1001); 
    chai.expect(func.callCount).eq(3); 
}) 

单元测试输出:

AssertionError: expected 1 to equal 2 
    + expected - actual 

    -1 
    +2 

基本上,函数从不自称。 Sinon假定时器部分http://sinonjs.org/docs/#clock中的代码正常工作。这个功能有什么不同?

+0

您的retryIfFail需要承诺作为参数。你在超时时将它留空... –

回答

0

当您在递归步骤中调用函数时,不会将布尔promise函数作为参数传递。你应该这样做:

setTimeout(retryIfFails, 1000, func, retryCount - 1); 

而且,我不知道如何假定时器的工作,但你可能想以较低的值来调用tick的两倍,因此定时器将被触发两次(但同样,我我不知道这部分)。

+0

谢谢,我确实忘了把这个功能当作论据。我把它放进去,但仍然失败。 – Sheikz

相关问题