2013-03-11 13 views
15

Ich muss eine Direktive testen, und es sollte eine Ausnahme ausgelöst werden. Wie kann ich testen, ob die Ausnahme in Jasmin geworfen wurde?So testen Sie, ob in AngularJS eine Ausnahme ausgelöst wird

Die Richtlinien-Link-Funktion:

link: function() { 
    if(something) { 
     throw new TypeError('Error message'); 
    } 
} 

Ich habe noch nicht implementiert erfolgreich einen Test, der tatsächlich den Fehler auffängt und meldet, dass der Test erfolgreich war.

Antwort

20

Dies ist, wie ich es tun:

describe("myDirective", function() { 
     it("should throw an error", inject(function ($compile, $rootScope) { 
       function errorFunctionWrapper() 
       { 
        $compile(angular.element("<div my-directive></div>"))($rootScope); 
       } 
       expect(errorFunctionWrapper).toThrow(); 
     })); 
}); 
+0

Danke, das hat es gelöst! –

7
it("should throw an error", inject(function ($compile, $rootScope) { 
     expect(function() { 
      $compile(angular.element("<directive-name></directive-name>"))($rootScope.$new()); 
     }).toThrow(); 
    })); 
+4

Mit anonymer Funktion ist viel elegantere Lösung IMO –

2

EDIT: dies scheint nun behoben werden. Getestet mit Angular 1.6.4.


In Angular 1.6, ich bin nicht in der Lage gewesen, während der $compile Phase geworfen Fehler abzufangen. Zwar nicht so elegant, kann ich noch überprüfen gegen den $exceptionHandler.errors Array (source):

it('throws an error', function() { 
    $compile(angular.element('<directive-name></directive-name>'))($rootScope.$new()); 
    expect($exceptionHandler.errors.length).toBeGreaterThan(0); 
}); 

Noch besser wäre es, bietet sie mit der genauen Fehlermeldung (e):

expect($exceptionHandler.errors).toEqual(['first error', 'second error']) 
0

Ausnahmebehandlung in Winkelprüfung ist besser mit nativen Winkel Service

https://docs.angularjs.org/api/ng/service/$exceptionHandler

Dies gibt bessere Handhabe für die ausgelösten Ausnahmen und bietet eine bessere native Art, die Ausnahme global zu behandeln. Sagen Sie, wenn Sie zu einem bestimmten Zeitpunkt die Ausnahmebehandlungsstrategie Ihrer Anwendung an einem einzigen Ort ändern können.

diese zu testen, wenn zusammen mit $ exceptionHandlerProvider verwendet

https://docs.angularjs.org/api/ngMock/provider/$exceptionHandlerProvider

gibt Ihnen einen besseren Griff auf die generierte Ausnahme und spezifischen Tests schreiben.

Für Komponententests ist es keine Standardmethode in angular, um eine Ausnahme mit .toThrow() zu validieren; Methode von Jasmin.

Verwandte Themen