2013-03-11 9 views
15

Potrzebuję przetestować dyrektywę i powinien wyrzucić wyjątek. Jak mogę sprawdzić, czy wyjątek został rzucony w jaśmin?Jak przetestować wyjątek w AngularJS

Funkcja dyrektyw Link:

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

jeszcze nie wdrożył pomyślnie test, który rzeczywiście łapie błąd i donosi, że test zakończył się powodzeniem.

Odpowiedz

20

To jak to zrobić:

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

Dzięki, że to rozwiązałeś! –

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

Korzystanie z anonimowej funkcji jest znacznie bardziej eleganckim rozwiązaniem IMO –

2

EDIT: to wydaje się być naprawione. Przetestowano za pomocą Angular 1.6.4.


kątowej 1,6, jestem w stanie wychwycić błędy zgłoszone podczas fazy $compile. jeszcze

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

lepiej, przekazać jej wiadomość dokładny opis błędu (ów):: Choć nie tak eleganckie, mogę jeszcze sprawdzić na tablicy $exceptionHandler.errors (source) postępowanie

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

wyjątek w testach kątowych lepiej wykonywać rodzimą obsługę kątową:

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

zapewnia to lepszą obsługę wyrzucanych wyjątków i zapewnia lepszy, rodzimy, kątowy sposób obsługi wyjątku globalnie. powiedz, że w pewnym momencie możesz zmienić strategię obsługi wyjątków aplikacji w jednym miejscu.

w testowaniu tego, gdy używane wraz z $ exceptionHandlerProvider

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

daje lepszy uchwyt na wygenerowanego wyjątku i napisać konkretnych testów.

dla testów jednostkowych nie jest to standardowy sposób kątowy do sprawdzania wyjątku za pomocą .toThrow(); metoda jaśminu.