2017-01-02 3 views
2

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

  1. Ruft ein Versprechen und wartet auf die Erfüllung
  2. 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?

+0

Ihr retryIfFails benötigt ein Versprechen als Argument. Du lässt es bei der Zeitüberschreitung leer ... –

Antwort

0

Wenn Sie Ihre Funktion im rekursiven Schritt aufrufen, übergeben Sie die boolesche Versprechungsfunktion nicht als Parameter. Sie tun sollen:

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

Auch ich bin nicht sicher, wie die gefälschte Timer Arbeit, aber Sie könnten tick zweimal mit einem niedrigen Wert nennen wollen, so wird der Timer zweimal ausgelöst werden (aber auch hier, ich Ich bin nicht sicher über diesen Teil).

+0

Danke, ich habe wirklich vergessen, die Funktion als Argument zu stellen. Ich habe es eingefügt, aber es schlägt immer noch fehl. – Sheikz

Verwandte Themen