Ich möchte eine rekursive Funktion testen, die eine Eingabefunktion wiederholt, bis sie erfolgreich ist (gibt true zurück).So testen Sie eine Funktion, die sich selbst aufruft
- Ruft ein Versprechen und wartet auf die Erfüllung
- Wenn der Rückgabewert positiv ist, stoppen. Andernfalls versuchen Sie erneut, die Anzahl der Wiederholungen zu verringern. Hier
ist die Umsetzung:
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);
}
Die Testeinheit mit sinon gefälschten Timer:
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);
})
Das Gerät Testausgänge:
AssertionError: expected 1 to equal 2
+ expected - actual
-1
+2
Grundsätzlich ist die Funktion nie ruft sich selbst an. Der Code in Sinon falsche Timer Abschnitt http://sinonjs.org/docs/#clock funktioniert gut. Was ist anders an dieser Funktion?
Ihr retryIfFails benötigt ein Versprechen als Argument. Du lässt es bei der Zeitüberschreitung leer ... –