【问题标题】:writing a unit test for an angular directive that requires ng-model为需要 ng-model 的 Angular 指令编写单元测试
【发布时间】:2016-01-08 01:42:34
【问题描述】:

我是单元测试的新手,并试图弄清楚如何设置它。我有以下指令:

(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;
            }
        }
    }

})();

该指令(如果作为非零属性添加到也使用 ng-model 的元素)通过向 ngModelController 添加验证器来确保模型值不为零。

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

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

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

提前致谢。

【问题讨论】:

    标签: javascript angularjs unit-testing


    【解决方案1】:

    您可以使用$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();
    
      });
    
    });
    

    【讨论】:

    • 谢谢,谢谢。测试正在运行,我非常感谢您的帮助。我有一个问题。我想知道为什么需要角度模拟。我想我很难理解对角度的依赖在哪里结束,对角度模拟的依赖从哪里开始。我的意思是,注入是茉莉花功能?然后 $compile 和 $rootscope 被 angular-mocks 添加为全局变量?哪个库提供模块功能?有什么方法可以根据哪个依赖项在做什么来稍微分解测试?
    • module()inject() 函数都来自 angular-mocks 库。
    • 好的,还有一个稍微重提的问题,我将如何调试测试?是否有任何实用程序可以指定依赖项(有点像业力)和测试,它会打开一个网页(比如 chrome),我可以在其中逐步完成测试?这可以通过业力来完成吗(当我运行我的业力任务时,它会打开然后关闭浏览器......谢谢。
    • 为什么要指定依赖项?客户端依赖项,例如第 3 部分 angularjs 模块?
    • 我的意思是运行测试所需的任何文件,包括我自己的模块、第 3 方模块、角度模拟/角度源等。
    猜你喜欢
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 2021-03-12
    • 2011-03-29
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多