我需要测试一个指令,它应该抛出异常。如何在jasmine中测试抛出异常?
指令链接功能:
link: function() {
if(something) {
throw new TypeError('Error message');
}
}
我还没有成功实现一个实际捕获错误并报告测试成功的测试。
答案 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()验证异常不是角度的标准方法;茉莉花的方法。