AngularJs单元测试隔离范围指令

AngularJs单元测试隔离范围指令,angularjs,unit-testing,angularjs-scope,jasmine,Angularjs,Unit Testing,Angularjs Scope,Jasmine,我想测试以下指令“spinInput”,它需要ngModel,但我无法访问该指令的范围。我得到的只是一个空范围。使用Angularjs 1.3.13 指令: angular.module('charts.spinInput',[]).directive('spinInput', function() { return { restrict: 'E', replace: true, require:'ngModel', scope: { min:"@"

我想测试以下指令“spinInput”,它需要ngModel,但我无法访问该指令的范围。我得到的只是一个空范围。使用Angularjs 1.3.13

指令:

angular.module('charts.spinInput',[]).directive('spinInput', function() {
return {
    restrict: 'E',
    replace: true,
    require:'ngModel',
    scope: {
      min:"@"
    },
    controller:function($scope)
    {
        $scope.test=12;

      $scope.calcAngle=function(point)
        {
            var xDif=point.x-50;
            var yDif=point.y-50;

            return (Math.atan2(yDif, xDif) * 180 / Math.PI);

        };

},

    templateUrl: 'charts/directive/spinInput/spinInput.html',
    link:function(scope, element, attr,ngModel) {
       ...
    }

    };
});
单元测试: 引发以下错误:TypeError:“undefined”不是对象(正在计算“innerScope.min”)

description('spinInput',function()){
每个模块之前(模块(“图表”);
var$httpBackend;
var元素;
var外窥镜;
var内窥镜;
beforeach(注入(函数($rootScope、$compile、$injector){
元素=角度。元素(“”);
$httpBackend=$injector.get(“$httpBackend”);
$httpBackend.whenGET('charts/directive/spinInput/spinInput.html')。响应(200,);
outerScope=$rootScope.$new();
$compile(元素)(外部范围);
innerScope=element.isolateScope();
外层镜。$digest();
}));
它('应定义scope.min',函数(){
expect(innerScope.min).toBeDefined();
});
});

尝试将外部范围。$digest()放在元素之前。isolateScope()

尝试将外部范围。$digest()放在元素之前。isolateScope()

您构建测试的方式似乎导致了问题

我已经能够成功地测试隔离范围,如下所示

您可以查看在此平台上运行的测试(模板代码已注释掉)

descripe('指令:spinInput',函数(){
变量范围、编译、validHTML、templateHtml;;
validHTML=“”;
在每个模块之前(模块(‘myApp’);
beforeach(注入函数($compile、$rootScope、$templateCache){
templateHtml=$templateCache.get('charts/directive/spinInput/spinInput.html');
如果(!templateHtml){
templateHtml=$.ajax('charts/directive/spinpoint/spinpoint.html',{async:false}).responseText;
$templateCache.put('charts/directive/spinInput/spinInput.html',templateHtml)
}
scope=$rootScope.$new();
compile=$compile;
}));
函数create(){
var elem,compiledElem;
elem=角度元素(validHTML);
compiledElem=编译(elem)(范围);
范围。$digest();
返回compiledlem;
}
它('应定义scope.min',函数(){
var el=create();
期望(el.isolateScope().min).toBeDefined();
});
它('scope.min应等于12',函数(){
var el=create();
expect(el.isolateScope().min).toEqual('12');
});
});

您构建测试的方式似乎引起了一些问题

我已经能够成功地测试隔离范围,如下所示

您可以查看在此平台上运行的测试(模板代码已注释掉)

descripe('指令:spinInput',函数(){
变量范围、编译、validHTML、templateHtml;;
validHTML=“”;
在每个模块之前(模块(‘myApp’);
beforeach(注入函数($compile、$rootScope、$templateCache){
templateHtml=$templateCache.get('charts/directive/spinInput/spinInput.html');
如果(!templateHtml){
templateHtml=$.ajax('charts/directive/spinpoint/spinpoint.html',{async:false}).responseText;
$templateCache.put('charts/directive/spinInput/spinInput.html',templateHtml)
}
scope=$rootScope.$new();
compile=$compile;
}));
函数create(){
var elem,compiledElem;
elem=角度元素(validHTML);
compiledElem=编译(elem)(范围);
范围。$digest();
返回compiledlem;
}
它('应定义scope.min',函数(){
var el=create();
期望(el.isolateScope().min).toBeDefined();
});
它('scope.min应等于12',函数(){
var el=create();
expect(el.isolateScope().min).toEqual('12');
});
});

问题出在ng模型指令上问题出在ng模型指令上
 describe('spinInput', function() {

 beforeEach(module('charts'));

    var $httpBackend;
    var element;
    var outerScope;
    var innerScope;




    beforeEach(inject(function($rootScope, $compile  , $injector) {
        element = angular.element('<spin-input min="12"></spin-input>');
        $httpBackend = $injector.get('$httpBackend');
        $httpBackend.whenGET('charts/directive/spinInput/spinInput.html').respond(200, '');
        outerScope = $rootScope.$new();
        $compile(element)(outerScope);

        innerScope = element.isolateScope();

        outerScope.$digest();
    }));


    it('scope.min should be defined', function() {
        expect(innerScope.min).toBeDefined();
    });


});
describe('Directive: spinInput', function() {

var scope, compile, validHTML, templateHtml;;


validHTML = '<spin-input min="12"></spin-input>';

beforeEach(module('myApp'));

beforeEach(inject(function($compile, $rootScope, $templateCache){

    templateHtml = $templateCache.get('charts/directive/spinInput/spinInput.html');
    if(!templateHtml) {
            templateHtml = $.ajax('charts/directive/spinInput/spinInput.html', {async: false}).responseText;
            $templateCache.put('charts/directive/spinInput/spinInput.html', templateHtml)
    }


    scope = $rootScope.$new();
    compile = $compile;
}));

function create() {
    var elem, compiledElem;
    elem = angular.element(validHTML);
    compiledElem = compile(elem)(scope);
    scope.$digest();

    return compiledElem;    
}


it('scope.min should be defined', function() {
    var el = create();
    expect(el.isolateScope().min).toBeDefined();
});

it('scope.min should equal 12', function() {    
    var el = create();
    expect(el.isolateScope().min).toEqual('12'); 
});

});