Как проверить, выбрано ли исключение в AngularJS

Мне нужно проверить директиву, и она должна выдать исключение. Как я могу проверить, что исключение было выбрано, в жасмине?

Функция ссылок директив:

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

Я еще не успешно реализовал тест, который действительно улавливает ошибку и сообщает, что тест прошел успешно.

Ответы

Ответ 1

Вот как я это делаю:

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();
        }));
});

Ответ 2

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

Ответ 3

EDIT: теперь это исправлено. Протестировано с помощью Angular 1.6.4.


В Angular 1.6 я не смог поймать ошибки, возникшие во время фазы $compile. Хотя это не так элегантно, я все же могу проверить массив $exceptionHandler.errors (источник):

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

Еще лучше, предоставьте ему точные сообщения об ошибках:

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

Ответ 4

Обработка исключений в angular лучше выполнять с помощью службы angular

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

это дает лучшую обработку отброшенных исключений и обеспечивает лучший родной способ angular для обработки исключения по всему миру. скажем, если в какой-то момент вы можете изменить стратегию обработки исключений вашего приложения в одном месте.

при тестировании этого при использовании вместе с $exceptionHandlerProvider

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

дает вам лучший дескриптор генерируемого исключения и записывает конкретные тесты.

для модульных тестов это не стандартный способ в angular для проверки исключения с использованием .toThrow(); метод жасмина.