isolateScope() 给出未定义的 - 使用 Karma 的单元测试指令
isolateScope() gives undefined - Unit Testing directives with Karma
如问题标题所述,我在调用 isolateScope()
时变得不确定。我尝试根据 Unit Testing AngularJS Directives With External Templates.
上给出的说明对我的 Angular 指令进行单元测试
这是我的代码:
directive.js
angular.module("myTestApp")
.directive("testDirective", function(){
return{
restrict: "E",
require: "ngModel",
scope:{
ngModel: "=",
label: "@?"
},
templateUrl: "/mypath/templates/testDirective.html",
link: function($scope, element, attributes, ngModelCtrl){
$scope.functions = {},
$scope.settings = {
label: $scope.label ? $scope.label : ""
}
}
};
});
我已将 karma-ng-html2js-preprocessor
用于 templateUrl。
karma.conf.js(代码只包含与ng-html2js相关的部分)
files:[
//All Js files concerning directives are also included here...
'/mypath/templates/*.html'
],
preprocessors: {
'/mypath/templates/*.html': [ng-html2js']
},
ngHtml2JsPreprocessor: {
moduleName: 'template'
},
plugins: ['karma-*'],
directiveSpec.js
describe("testDirective Test", function(){
var scope, $compile,$httpBackend, template;
beforeEach(module('myTestApp'));
beforeEach(module('template'));
beforeEach(inject(function($rootScope, _$compile_, _$httpBackend_){
scope = $rootScope.$new();
$compile = _$compile_;
$httpBackend = _$httpBackend_;
}));
it("should check if the value of label attribute id set to dummyLabel", function(){
$httpBackend.expect('GET','/mypath/templates/testDirective.html').respond();
scope.label = 'dummyLabel';
var element = angular.element('<test-directive label= "label" ></test-directive>');
element = $compile(element)(scope);
console.log(element);
scope.$digest();
console.log('Isolate scope: '+ element.isolateScope());
expect(element.isolateScope().label).toEqual('dummyLabel');
});
});
此处 console.log(element);
打印 {0: <test-directive label="label" class="ng-scope"></test-directive>, length: 1}
问题: console.log('Isolate scope: '+ element.isolateScope());
给出 undefined
.
我在 Whosebug 中的许多问题上查看了这个问题,但未能找到正确的解决方案。
此外,我必须使用 $httpBackend
来获取 html 文件,否则它会抛出 Unexpected Request
错误。
我将非常感谢任何帮助,因为我在过去一个星期以来一直坚持这个错误!
乍一看只是猜测,但是...
您的 .respond()
需要 return 一些东西。现在您正在拦截对您的模板的请求并且不响应任何内容,因此导致空数据和 isolateScope()
未定义。
对于可能有同样问题的人:
当使用 $httpBackend
模拟 HTML 文件时,指令测试没有按预期工作。应该是,并且可以通过简单地使用 ng-html2js
插件来包含 HTML 文件。所以我删除了 $httpBackend 调用并使用 stripPrefix
将我的 HTML 文件正确包含为模块。成功了!
希望对其他人有所帮助!
如问题标题所述,我在调用 isolateScope()
时变得不确定。我尝试根据 Unit Testing AngularJS Directives With External Templates.
这是我的代码:
directive.js
angular.module("myTestApp")
.directive("testDirective", function(){
return{
restrict: "E",
require: "ngModel",
scope:{
ngModel: "=",
label: "@?"
},
templateUrl: "/mypath/templates/testDirective.html",
link: function($scope, element, attributes, ngModelCtrl){
$scope.functions = {},
$scope.settings = {
label: $scope.label ? $scope.label : ""
}
}
};
});
我已将 karma-ng-html2js-preprocessor
用于 templateUrl。
karma.conf.js(代码只包含与ng-html2js相关的部分)
files:[
//All Js files concerning directives are also included here...
'/mypath/templates/*.html'
],
preprocessors: {
'/mypath/templates/*.html': [ng-html2js']
},
ngHtml2JsPreprocessor: {
moduleName: 'template'
},
plugins: ['karma-*'],
directiveSpec.js
describe("testDirective Test", function(){
var scope, $compile,$httpBackend, template;
beforeEach(module('myTestApp'));
beforeEach(module('template'));
beforeEach(inject(function($rootScope, _$compile_, _$httpBackend_){
scope = $rootScope.$new();
$compile = _$compile_;
$httpBackend = _$httpBackend_;
}));
it("should check if the value of label attribute id set to dummyLabel", function(){
$httpBackend.expect('GET','/mypath/templates/testDirective.html').respond();
scope.label = 'dummyLabel';
var element = angular.element('<test-directive label= "label" ></test-directive>');
element = $compile(element)(scope);
console.log(element);
scope.$digest();
console.log('Isolate scope: '+ element.isolateScope());
expect(element.isolateScope().label).toEqual('dummyLabel');
});
});
此处 console.log(element);
打印 {0: <test-directive label="label" class="ng-scope"></test-directive>, length: 1}
问题: console.log('Isolate scope: '+ element.isolateScope());
给出 undefined
.
我在 Whosebug 中的许多问题上查看了这个问题,但未能找到正确的解决方案。
此外,我必须使用 $httpBackend
来获取 html 文件,否则它会抛出 Unexpected Request
错误。
我将非常感谢任何帮助,因为我在过去一个星期以来一直坚持这个错误!
乍一看只是猜测,但是...
您的 .respond()
需要 return 一些东西。现在您正在拦截对您的模板的请求并且不响应任何内容,因此导致空数据和 isolateScope()
未定义。
对于可能有同样问题的人:
当使用 $httpBackend
模拟 HTML 文件时,指令测试没有按预期工作。应该是,并且可以通过简单地使用 ng-html2js
插件来包含 HTML 文件。所以我删除了 $httpBackend 调用并使用 stripPrefix
将我的 HTML 文件正确包含为模块。成功了!
希望对其他人有所帮助!