这是我对AngularJS指令的第一次测试,我可能会遗漏一些非常基本的东西。
运行我的测试套件时,在调用$ compile函数后出现错误:当它试图评估urlIsSameOrigin:
TypeError:'undefined'不是对象(评估'parsed.protocol')
tableDirective.js指令
https://gist.github.com/jdreimann/a5076363f1d8f3a605a0
tableDirective.js test
'use strict';
describe('Directive: TableDirective', function() {
var $rootScope,
$compile,
elmBody;
beforeEach(module('wdUiCoreApp'));
beforeEach(inject(function (_$compile_ , _$rootScope_) {
$compile = _$compile_;
$rootScope = _$rootScope_;
elmBody = angular.element(
'<div ui-core-table><div class="panel__header"></div></div>'
);
$compile(elmBody)($rootScope);
scope.$digest();
}));
describe('elmBody', function () {
it('should be an object', function() {
expect(elmBody).toEqual(jasmine.any(Object));
});
});
堆栈跟踪
TypeError: Cannot read property 'protocol' of undefined
at urlIsSameOrigin (http://localhost:8082/base/app/bower_components/angular/angular.js:13820:17)
at $http (http://localhost:8082/base/app/bower_components/angular/angular.js:7629:23)
at Function.$http.(anonymous function) (http://localhost:8082/base/app/bower_components/angular/angular.js:7847:18)
at compileTemplateUrl (http://localhost:8082/base/app/bower_components/angular/angular.js:6463:13)
at applyDirectivesToNode (http://localhost:8082/base/app/bower_components/angular/angular.js:6066:24)
at compileNodes (http://localhost:8082/base/app/bower_components/angular/angular.js:5669:15)
at compile (http://localhost:8082/base/app/bower_components/angular/angular.js:5602:15)
at null.<anonymous> (http://localhost:8082/base/test/spec/directives/tableDirective.js:18:5)
at Object.invoke (http://localhost:8082/base/app/bower_components/angular/angular.js:3762:17)
at workFn (http://localhost:8082/base/app/bower_components/angular-mocks/angular-mocks.js:2144:20)
Error: Declaration Location
at window.inject.angular.mock.inject (http://localhost:8082/base/app/bower_components/angular-mocks/angular-mocks.js:2129:25)
at null.<anonymous> (http://localhost:8082/base/test/spec/directives/tableDirective.js:11:14)
at jasmine.Env.describe_ (http://localhost:8082/base/node_modules/karma-jasmine/lib/jasmine.js:884:21)
at jasmine.Env.describe (http://localhost:8082/base/node_modules/karma-jasmine/lib/jasmine.js:869:15)
at describe (http://localhost:8082/base/node_modules/karma-jasmine/lib/jasmine.js:629:27)
at http://localhost:8082/base/test/spec/directives/tableDirective.js:3:1
答案 0 :(得分:6)
问题是uiCoreTable
指令通过一个返回元素template
属性值的函数来定义其模板URL。
由于您的测试代码未指定template
属性,因此未定义模板URL,并且当Angular尝试从服务器请求模板URL时会引发错误。
更具体地说,$http
服务的一个安全检查引发了异常:检查URL的protocol
的测试尝试访问parsed.protocol
,但parsed
未定义(因为templateUrl
未定义)。
如果现在不明显,为了使错误消失,您需要在template
属性中指定模板URL。 E.g:
elmBody = angular.element('<div ui-core-table template="/path/to/template.html">...</div>');
<子>
如果您不想向服务器发出实际请求,可以使用一些HTML预先填充$templateCache
(在密钥/path/to/template.html
下),或者使用模拟的$httpBackend
训练/path/to/template.html
请求定位{{1}}时的自定义响应。
子>