如何测试AngularJS中是否抛出异常

时间:2013-03-11 21:40:32

标签: unit-testing angularjs jasmine angularjs-directive

我需要测试一个指令,它应该抛出异常。如何在jasmine中测试抛出异常?

指令链接功能:

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

我还没有成功实现一个实际捕获错误并报告测试成功的测试。

4 个答案:

答案 0 :(得分:20)

我就是这样做的:

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

答案 1 :(得分:7)

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

答案 2 :(得分:2)

编辑:现在似乎已修复了。使用Angular 1.6.4进行测试。

在Angular 1.6中,我无法捕捉$compile阶段引发的错误。虽然不那么优雅,但我仍然可以检查$exceptionHandler.errors数组(source):

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'])

答案 3 :(得分:0)

使用原生角度服务

可以更好地完成角度测试中的异常处理

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

这样可以更好地处理抛出的异常,并提供更好的原生角度方式来全局处理异常。如果在某个时间点,您可以在一个地方更改应用程序的异常处理策略。

与$ exceptionHandlerProvider一起使用时测试它

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

可以更好地处理生成的异常并编写特定的测试。

对于单元测试,使用.toThrow()验证异常不是角度的标准方法;茉莉花的方法。