2017-01-02 18 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); 
    } 
    

    単体テスト使用sinon偽タイマー:

    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

あなたのretryIfFailsは引数として約束を必要とします。あなたはタイムアウト時にそれを空白のままにします... –

答えて

0

再帰的なステップで関数を呼び出すと、ブール値のpromise関数をパラメータとして渡すことはありません。あなたは実行する必要があります。

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

をまた、私は偽のタイマーがどのように動作するかわからないですが、あなたは、より低い値で二回tickを呼び出すこともできますので、タイマーは再び二回トリガ(されますが、私は」この部分についてはわかりません)。

+0

ありがとう、私は実際に議論としてfuntionを置くことを忘れました。私はそれを入れたが、それでも失敗する。 – Sheikz

関連する問題