Promise.catch () fängt im AngularJS-Komponententest keine Ausnahme ab

Impworks

Ich schreibe Jasmine-Komponententests für meine App in Typescript und führe sie über Resharper aus. Es soll eine Aktion ausführen, wenn der Handler eine Ausnahme auslöst:

describe("Q Service Test", () => {
    var q: ng.IQService;
    var rootScope: ng.IRootScopeService;

    beforeEach(inject(($q, $rootScope) => {
        q = $q;
        rootScope = $rootScope;
    }));

    it("Caught exceptions are handled properly", () => {
        var state = 'ok';
        q.when(1)
            .then(() => {
                throw new Error("test exception");
            })
            .catch(() => {
                state = 'error';
            });

        rootScope.$digest();
        expect(state).toBe('error');
    });
});

Der Test ist jedoch fehlgeschlagen:

Resharper-Test fehlgeschlagen

Ist es ein seltsames Verhalten meiner Testumgebung / Tools oder verwende ich den Versprechensmechanismus selbst falsch?

Roggenballar

Sie verwenden den Versprechensmechanismus definitiv falsch . Wenn Sie eine benutzerdefinierte Wurfanweisung auslösen , bedeutet dies nicht, dass Sie sie als Ablehnung eines Versprechens richtig abfangen. Wie in der $qDokumentation angegeben:

Wenn deferreds / Versprechen dem bekannten Verhalten von try / catch / throw zu vergleichen, denken Sie an ablehnen als throw in JavaScript - Schlüsselwort. Dies bedeutet auch, dass Sie, wenn Sie einen Fehler über einen Versprechungsfehler-Rückruf "abfangen" und den Fehler an das aus dem aktuellen Versprechen abgeleitete Versprechen weiterleiten möchten, den Fehler "zurückwerfen" müssen, indem Sie eine durch Zurückweisen erstellte Ablehnung zurückgeben.

Sie sind ähnlich, aber nicht äquivalent. Um benutzerdefinierte throw-Anweisungen abzufangen, sollten Sie catchAnweisungsblöcke verwenden. Während $qVersprechen nur catchVersprechen ablehnen sollten . In Ihrem Fall ist die Rückgabe eines abgelehnten Versprechens daher die richtige Vorgehensweise, anstatt eine benutzerdefinierte Ausnahme auszulösen.

DEMO

JAVASCRIPT

describe('Q Service Test', function() {

  var $q,
      $rootScope;

  beforeEach(inject(function(_$q_, _$rootScope_) {
    $q = _$q_;
    $rootScope = _$rootScope_;
  }));

  it('Rejected promises are handled properly', function() {

    var state = 'ok';

    $q.when(1)
      .then(function() {
        return $q.reject('rejected');
      })
      .catch(function() {
        state = 'error';
      });

    $rootScope.$digest();
    expect(state).toBe('error');    

  });

});

AKTUALISIEREN:

Der Grund, warum sich Ihr Code im Browser so verhält, liegt darin, dass die $qImplementierung von Angular die try/catchAnweisungsblöcke bei der Verarbeitung der Versprechungswarteschlange verwendet. Wenn einer der Rückrufe Fehler auslöst, fängt er den Fehler selbst ab, lehnt ihn mit der Ausnahme als Grund für die Ablehnung ab und $exceptionHandlerprotokolliert anschließend den Fehler. Ich empfehle Ihnen, das abgelehnte Versprechen einfach zurückzugeben.

Der Grund, warum die Komponententests so ablaufen, liegt in der angular-mocksImplementierung, die $exceptionHandlersich von der tatsächlichen Anwendung unterscheidet $exceptionHandler. Ersteres erstellt einen Anbieter mit verschiedenen Modi. Die Standard-Angle-Mocks-Implementierung verwendet den rethrowModus, der wiederum die Ausnahme auslöst, anstatt sie zu protokollieren. Wenn Sie möchten, dass sich Ihre Komponententests genauso verhalten wie die Standardanwendung, können $exceptionHandlerSie den Modus auf einstellen 'log'.

DEMO

JAVASCRIPT

describe('Q Service Test', function() {

  var $q,
      $rootScope;

  beforeEach(module('ng', function($exceptionHandlerProvider) {
    $exceptionHandlerProvider.mode('log');
  }));

  beforeEach(inject(function(_$q_, _$rootScope_) {
    $q = _$q_;
    $rootScope = _$rootScope_;
  }));

  it('Caught exceptions are handled properly', function() {

    var state = 'ok';

    $q.when(1)
      .then(function() {
        throw new Error();
      })
      .catch(function() {
        state = 'error';
      });

    $rootScope.$digest();
    expect(state).toBe('error');    

  });

});

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

@ try / @ catch fängt keine Ausnahme ab

Try / Catch fängt keine Ausnahme ab

@ try @ catch-Block fängt keine innere Ausnahme ab

Scala Try-Catch fängt keine Ausnahme ab

Try-Catch fängt keine Ausnahme ab

Ausnahme fängt im Try/Catch-Block nicht ab

UncaughtExceptionHandler fängt keine Ausnahme ab

Oracle fängt keine Ausnahme ab

Der C ++ Try-Catch-Block fängt keine Hardware-Ausnahme ab

Warum fängt Catch keine Fehler ab?

Safari fängt keine Ausnahme ab, wenn versucht wird, mit Javascript try / catch auf das übergeordnete Fensterobjekt zuzugreifen

Warum fängt "catch" diese Ausnahme nicht ab?

Verschachtelter Try-Catch-Block fängt Ausnahme nicht ab

Python Requests Mock fängt keine Timeout-Ausnahme ab

Warum fängt mein Code keine Ausnahme ab?

C# fängt keine "verschachtelte" benutzerdefinierte Ausnahme ab

JUnit-Test fängt keine Ausnahme ab

Flurl & xUnit fängt keine Ausnahme mit wait ab

ObjectDoesNotExist fängt keine DoesNotExist-Ausnahme ab

Entity Framework fängt keine SQL-Ausnahme ab

reactjs try catch in render fängt keine untergeordneten Fehler ab

try..catch fängt keine asynchronen / warte Fehler ab

try / catch PHP fängt keine Ausnahmen ab (Laravel Controller)

NodeJS: Promise fängt keine ausgelösten Ausnahmen ab

Warum fängt ein Try-Catch-Block aufgrund eines ungültigen ausführbaren Pfads in Node.js keine Spawn-Ausnahme für child_process ab?

AngularJS fängt keine direkten Anforderungen von der Adressleiste ab

Try block löst eine Ausnahme aus, catch catch fängt sie jedoch nicht ab

Wie fängt man Musterfehler im Eingabefeld in AngularJS ab?

Kamel fängt keine Ausnahme

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  3. 3

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  4. 4

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  7. 7

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  8. 8

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  9. 9

    Eclipse Oxygen - Projekte verschwinden

  10. 10

    Wie wählt man Unterschiede mit drei Tabellen aus?

  11. 11

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  12. 12

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  13. 13

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  14. 14

    Wie kann ich den Kaskadenmodus global einstellen?

  15. 15

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  16. 16

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  17. 17

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  18. 18

    Was ist schneller: SUM über NULL oder über 0?

  19. 19

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  20. 20

    Kann ich ein Tkinter-Canvas erstellen, das mehrere Zeilen in einem Text-Widget umfasst?

  21. 21

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

heißlabel

Archiv