如果 attr 未定义,则测试指令抛出异常
testing directive throw exception if attr is undefined
我有一个 angularjs 指令,它需要定义一个资源 attr 才能形成一些逻辑。接下来是它的最小定义:
angular.module('myAppName')
.directive('loadObjects', loadObjects);
function loadObjects($window) {
var directive = {
restrict: 'E',
template: '<md-content class="md-whiteframe-z4" layout-padding></md-content>',
link: function(scope, element, attrs) {
if (angular.isUndefined(attrs.resource)) {
throw 'resource attr is mandatory';
}
}
};
return directive;
}
然后在我的测试中,我尝试测试无效模板是否引发异常。
describe('LoadObjects directive', function() {
beforeEach(module('myAppName'));
it('should throw an error if resource attr is not defined', inject(function($rootScope, $compile) {
var scope = $rootScope.$new();
var elem = angular.element('<load-objects></load-objects>');
expect(function() { $compile(elem)(scope); }).toThrow('resource attr is mandatory');
}));
});
但我得到下一个错误:
Expected function to throw 'resource attr is mandatory', but it threw TypeError: 'undefined' is not an object (evaluating '$window.Raven.captureMessage')
我还尝试在模板中使用该指令,我可以在 javascript 控制台中看到异常。
欢迎提出任何建议。感谢阅读。
编辑
在那之后,我尝试使用:
beforeEach(module('myAppName', function($provide, $injector) {
$provide.constant('DEBUG', true);
console.log($injector.get('DEBUG')); // it prints true
}));
在 beforeEach 内部,DEBUG 被更改,但它不起作用。
为了我的测试成功,我需要 DEBUG=true
,我的第二个问题:这种方法有什么问题?
好的,这是我的最终方法:
正如我所说的,如果我配置我的测试将会通过:
$ravenProvider.development(DEBUG); // with DEBUG=true
但是因为:
beforeEach(module('myAppName', function($provide, $injector) {
$provide.constant('DEBUG', true);
console.log($injector.get('DEBUG')); // it prints true
}));
不起作用,我决定直接改变传递给 raven 的值:
beforeEach(module('myAppName', function($ravenProvider) {
$ravenProvider.development(true);
}));
现在就可以了。
我有一个 angularjs 指令,它需要定义一个资源 attr 才能形成一些逻辑。接下来是它的最小定义:
angular.module('myAppName')
.directive('loadObjects', loadObjects);
function loadObjects($window) {
var directive = {
restrict: 'E',
template: '<md-content class="md-whiteframe-z4" layout-padding></md-content>',
link: function(scope, element, attrs) {
if (angular.isUndefined(attrs.resource)) {
throw 'resource attr is mandatory';
}
}
};
return directive;
}
然后在我的测试中,我尝试测试无效模板是否引发异常。
describe('LoadObjects directive', function() {
beforeEach(module('myAppName'));
it('should throw an error if resource attr is not defined', inject(function($rootScope, $compile) {
var scope = $rootScope.$new();
var elem = angular.element('<load-objects></load-objects>');
expect(function() { $compile(elem)(scope); }).toThrow('resource attr is mandatory');
}));
});
但我得到下一个错误:
Expected function to throw 'resource attr is mandatory', but it threw TypeError: 'undefined' is not an object (evaluating '$window.Raven.captureMessage')
我还尝试在模板中使用该指令,我可以在 javascript 控制台中看到异常。
欢迎提出任何建议。感谢阅读。
编辑
在那之后,我尝试使用:
beforeEach(module('myAppName', function($provide, $injector) {
$provide.constant('DEBUG', true);
console.log($injector.get('DEBUG')); // it prints true
}));
在 beforeEach 内部,DEBUG 被更改,但它不起作用。
为了我的测试成功,我需要 DEBUG=true
,我的第二个问题:这种方法有什么问题?
好的,这是我的最终方法:
正如我所说的,如果我配置我的测试将会通过:
$ravenProvider.development(DEBUG); // with DEBUG=true
但是因为:
beforeEach(module('myAppName', function($provide, $injector) {
$provide.constant('DEBUG', true);
console.log($injector.get('DEBUG')); // it prints true
}));
不起作用,我决定直接改变传递给 raven 的值:
beforeEach(module('myAppName', function($ravenProvider) {
$ravenProvider.development(true);
}));
现在就可以了。