【问题标题】:How to test if exception is thrown in AngularJS如何测试AngularJS中是否抛出异常
【发布时间】:2013-03-11 21:40:32
【问题描述】:

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

指令链接函数:

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

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

【问题讨论】:

    标签: unit-testing angularjs jasmine angularjs-directive


    【解决方案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();
          }));
      

      【讨论】:

      • 使用匿名函数是更优雅的解决方案 IMO
      【解决方案3】:

      编辑:现在似乎已修复。使用 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'])
      

      【讨论】:

        【解决方案4】:

        角度测试中的异常处理最好使用原生角度服务来完成

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

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

        在与 $exceptionHandlerProvider 一起使用时进行测试

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

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

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

        【讨论】:

          猜你喜欢
          • 2021-02-26
          • 2019-11-26
          • 2021-06-20
          • 2014-12-07
          • 2016-06-16
          • 1970-01-01
          • 2021-08-25
          • 2019-06-11
          • 1970-01-01
          相关资源
          最近更新 更多