Wie kann ich eine .catch Promise Return in AngularJS mit Jasmine testen?

9

Ich bin ziemlich neu in Javascript und habe gerade AngularJS gelernt, aber ich habe die meisten meiner Testfälle mit einigen tollen Beispielen, die ich gefunden habe, umgesetzt. Leider kann ich nichts finden, was mir helfen könnte, meinen aktuellen Fall zu testen.

Ich teste einen Controller mit einem verspotteten Service, dessen Methode ein Versprechen zurückgibt. Ich möchte, dass der verspottete Dienst einen Fehler zurückgibt, um den Block ".catch" in der Controller-Methode auszuführen. Ich kann sagen, dass es nicht auf verschiedene Arten korrekt aufgerufen wird:

  1. Ich benutze istanbul für die Code-Abdeckung und es sagt mir, dass ich nicht über den "Fang"
  2. Der Code im '.catch' Block wird nicht von dem ausgeführt, was ich über das Debugging feststellen kann

Der zu testende Controller muss speziell den '.catch' in $ scope.login:

testen

login.js

%Vor%

Der Service und die Methode, die ich versuchen möchte:

Auth.login

%Vor%

Und schließlich meine Testdatei. Der lustige Teil ist, dass alle Tests vorbei sind, aber das "erwarten" im letzten Test kann zu so ziemlich alles geändert werden und es geht noch weiter. Die ersten zwei Tests scheinen wie erwartet zu laufen, aber der letzte Test ist, wo ich versuche, den catch-Block auszuführen, indem ich einen Fehler von dem Pseudo-Auth-Dienst erstelle:

login.unit.js

%Vor%

Ich entschuldige mich dafür, so viel Code gepostet zu haben, aber ich wollte so viel Kontext wie möglich bereitstellen. Ich schätze wirklich jeden, der mir helfen kann, während ich mich im Unit-Testkurs erfahre. Danke !!!

** UPDATE **

Ich konnte mein Problem mit etwas Hilfe von unten lösen und einige syntaktische Fehler entdecken. Folgendes wurde behoben:

  1. Mein beforeEach beim letzten Test wurde nicht richtig geschlossen und schloss tatsächlich den letzten Test ein, der dazu führte, dass er nicht korrekt (oder überhaupt) ausgeführt wurde. Aus diesem Grund führte das Ändern der Erwartungsbedingungen zu keinen Fehlern.
  2. Ich habe mein beforeEach inject auf: mockAuthService.login.andReturn($q.reject({data: {message: 'Bad Login!'}})); geändert, indem ich das unten angegebene reject verwendet habe.
  3. Nachdem ich die beforeEach korrekt geschlossen habe, bekam ich eine Fehlermeldung, dass $ q nicht definiert war, also musste ich sie zu inject(function($q) hinzufügen

Nachdem ich diese Probleme behoben hatte, wurde das Versprechen korrekt abgelehnt und der Fehler wurde vom entsprechenden Code im Controller abgefangen.

    
sbrown 03.05.2014, 02:09
quelle

1 Antwort

8

Machen Sie vor oder während des Tests einen Teil der Umgebung wie folgt aus:

%Vor%

Nach dem Test stellen Sie die Umgebung wieder auf den neuesten Stand:

%Vor%

Dies ruft sofort den .catch() -Block des Codes auf, den Sie testen möchten.

    
Dan Beam 03.05.2014, 03:01
quelle