2017-01-02 130 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

相關問題