2013-03-11 32 views
15

我需要測試一個指令,它應該拋出一個異常。我如何測試在茉莉花中引發異常?如何測試在AngularJS中引發異常

的指令鏈接功能:

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

我還沒有成功地實施了測試,實際上捕獲錯誤並報告說,測試成功。

回答

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

謝謝,解決了! – 2013-03-11 22:27:25

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

使用匿名函數是更優雅的解決方案IMO – 2015-09-23 21:32:27

2

編輯:這似乎是現在的固定。使用Angular 1.6.4進行測試。


在角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); 
}); 

更妙的是,它提供確切的錯誤消息(S):

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

異常處理在角度測試中更好地使用原生角度服務完成

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

這可以更好地處理拋出的異常,並提供更好的原生方式來處理全局異常。比如說在某個時間點,你可以在一個地方改變你的應用程序的異常處理策略。

在測試此與$ exceptionHandlerProvider

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

給你上發生的例外更好地處理和寫入特定的測試一起使用時

單元測試它不是一個角度標準的方法來驗證使用.toThrow()的異常;茉莉花的方法。

相關問題