2015-12-31 82 views
1

我是单元测试新手,想弄清楚如何设置它。我有以下指令:为需要ng-model的角度指令编写单元测试

(function() { 
    'use strict'; 

    angular 
     .module('hntb-utils') 
     .directive('notZero', notZero); 

    //notZero.$inject = []; 

    function notZero() { 
     return { 
      require: 'ngModel', 
      link: link, 
      restrict: 'A', 
      scope: '=' 
     }; 

     function link(scope, element, attributes, ngModelCtrl) { 
      ngModelCtrl.$validators.notZero = function (value) { 
       return value != 0; 
      } 
     } 
    } 

})(); 

该指令(如果添加的话,作为属性不归零到也使用纳克 - 模型的元素)确保模型值不为零通过将验证到ngModelController。

我想弄清楚如何测试这个指令。我想我应该可能有这样的东西:

it("should ensure model is not zero", function() { 
... 
}); 

我只是真的坚持实施。我知道我应该使用角度模拟,但是如何?我嘲笑什么?

在此先感谢。

回答

3

您可以使用$compile服务来编译一个带有ngModel指令和notZero指令的输入元素。通过使用.controller()方法获取该元素的ngModelController。之后,操作该元素的范围模型以应用多个测试用例。

这里是demo

describe('notZero', function() { 

    var scope, 
    ngModel; 

    beforeEach(module('hntb-utils')); 

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

    scope = $rootScope.$new(); 

    var input = $compile('<input type="number" ng-model="model" not-zero />')(scope); 

    ngModel = input.controller('ngModel'); 

    })); 

    it("should validate a non-zero number as a valid number", function() { 

    scope.model = -1; 
    scope.$apply(); 
    expect(ngModel.$error.notZero).toBeFalsy(); 

    scope.model = 1; 
    scope.$apply(); 
    expect(ngModel.$error.notZero).toBeFalsy(); 

    }); 

    it("should validate a zero number as an invalid number", function() { 

    scope.model = 0; 
    scope.$apply(); 
    expect(ngModel.$error.notZero).toBeTruthy(); 

    }); 

}); 
+0

谢谢,为此。测试正在进行中,我非常感谢帮助。我有一个问题,但。我想知道为什么角模拟需要。我想我无法理解角度依赖关系的结束位置以及对角度嘲笑的依赖关系何时开始。我的意思是,注射是茉莉花功能?然后通过angular-mocks添加$ compile和$ rootscope作为全局变量?哪个库提供模块功能?有什么办法可以在哪些依赖关系正在做什么的意义上将测试分解一点? – pQuestions123

+0

'module()'和'inject()'函数都来自'angular-mocks'库。 – ryeballar

+0

好的,还有一个稍微重复的问题,我将如何去调试测试?是否有任何工具可以指定依赖关系(类似karma)和测试,并且它会打开一个网页(例如在Chrome中),在那里我可以通过测试?这可以通过业力来完成(当我运行我的业力任务,它打开,然后关闭浏览器...谢谢。 – pQuestions123