2016-05-16 10 views
5

Meine Anwendung verwendet einen Dienst, der ein Versprechen zurückgibt, das normalerweise von einer ganzen Reihe anderer Versprechen abhängig ist. Ich habe dies in separate benannte Funktionen umgestaltet, um das Testen (und die Lesbarkeit) zu vereinfachen. In diesem Fall möchte ich nur testen, dass die RUN-Funktion ihre Aufgabe erfüllt und die anderen Funktionen aufruft.Die Funktion wird aufgerufen, nachdem das Versprechen gelöst wurde, aber Jasmine den Test nicht besteht. Warum?

z.B.

run() { 
    return myService 
    .connection 
    .then(this.namedFunction1) 
    .then(this.namedFunction2) 
    .then(this.namedFunction3) 
    .catch((error) => { 
     console.log("doh!", error.stack); 
    }); 

Wenn ich testen, dass namedFunction1 Jasmine nicht genannt wurde, obwohl dies nicht der Fall ist. Hier ist ein kleines Codebeispiel ich gemacht Dinge einfach zu halten:

getString() { 
    return Promise.resolve("Heeeelp. Heeeelp!!"); 
    } 

    printToConsole(string) { 
    console.log(string); // This works! but Jasmine says nay :( 
    } 

    myFunction() { 
    this.getString() 
    .then(this.printToConsole) 
    .catch((error) => { 
     console.log("Some error occurred", error); 
    }); 
    } 

... und der Test:

it("should call the printToConsole function", function() { 
     spyOn(myClass, "printToConsole").and.callThrough(); //added the call through so it would print 
     myClass.myFunction(); 
     expect(myClass.printToConsole).toHaveBeenCalled(); 
    }); 

und der Ausgang ...

> Started F[2016-05-16 11:32:31.898] console - Heeeelp. Heeeelp!! 
> 
> 
> Failures: 1) MyClass myFunction should call the printToConsole 
> function Message: 
>  Expected spy printToConsole to have been called. Stack: 
>  Error: Expected spy printToConsole to have been called. 

I‘ Ich habe versucht, die Jasmine asynch done() -Funktion hinzuzufügen, aber das hat nichts getan, und letztendlich löst ich dieses Versprechen sofort im Beispiel auf.

Warum oder wie kann dieser Test fehlschlagen?

Jede Hilfe würde sehr geschätzt werden. Vielen Dank.

Antwort

4

Da myFunction ein asynchroner Vorgang ist. myFunction ruft eine asynchrone Funktion auf und kehrt dann sofort zurück, wonach die Testzusicherung ausgelöst wird. Zu diesem Zeitpunkt wurde printToConsole noch nicht wirklich aufgerufen. Sie sollten Jasmine's async test support verwenden, um diesen Test erfolgreich auszuführen.

Sie benötigen myFunction zu modifizieren, um die Versprechen zurückzukehren, damit Sie wissen, wenn es fertig ist:

myFunction() { 
    return this.getString() 
    .then(this.printToConsole) 
    .catch((error) => { 
    console.log("Some error occurred", error); 
    }); 
} 

Dann ändern Sie Ihren Test durch Jasmin die done Funktion zu nutzen:

it("should call the printToConsole function", function(done) { 
    spyOn(myClass, "printToConsole").and.callThrough(); //added the call through so it would print 
    myClass.myFunction().then(function() { 
    expect(myClass.printToConsole).toHaveBeenCalled(); 
    done(); 
    }).catch(done); // to make sure the test reports any errors 
}); 

Das sollte Dinge funktionieren.

+0

Ich habe versucht, zuvor mit der Async-Unterstützung, aber meine Behauptung war nicht in der myClass.myFunction(). Then() -Anweisung. Es macht jetzt mehr Sinn. Danke Kumpel. – spryce

Verwandte Themen