入力関数が成功するまで(trueを返す)再帰関数をテストしたいと思います。自分自身を呼び出す関数をユニットテストする方法
- は約束を呼び出し、戻り値が正の場合、その履行
- を待って、停止します。それ以外の場合は、再試行回数を減らしながら再試行してください。
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のコードは正常に動作します。この機能の違いは何ですか?
あなたのretryIfFailsは引数として約束を必要とします。あなたはタイムアウト時にそれを空白のままにします... –