【问题标题】:Unit Testing private functions in AngularJS DirectiveAngularJS 指令中的单元测试私有函数
【发布时间】:2014-01-29 03:10:47
【问题描述】:

如何对在指令中定义的函数进行单元测试,如以下 myFunc

angular.module('myApp')
  .directive('myDir', [function () {

    var myFunc = function (arg) {
      // code in here.
    };

    return {
      restrict: 'A',
      scope: { },
      link: function (scope, element) {

      }
    };
  }]);

或者您如何定义我不想在指令之外公开的可测试指令特定功能?

【问题讨论】:

    标签: javascript unit-testing angularjs angularjs-directive


    【解决方案1】:

    最常见的方法是不测试私有方法,而是测试公开其行为的公共接口。这意味着您的单元测试成为您的公共接口的合同。

    您已声明您不想在指令之外公开,但当然另一种选择是将这个逻辑提取到某个服务myDirService 并在那里执行您的逻辑。在这种情况下,您将能够单独进行测试。

    【讨论】:

    • 我只提到了这个方法,因为我无法用正确的值模拟一个事件。我知道 e2e 测试可能是最好的测试方法,但我也想对其进行一些单元测试。我试图模拟的事件是文件输入上的change 事件。我的指令正在听那个,我无法让事件对象上有正确的目标和文件。不过,我想我应该在一个单独的问题中提出这个问题,谢谢您的解释。
    【解决方案2】:

    正如@eddiec 所指出的,理想情况下,我们不应该处于需要测试私有方法的情况,但我们并不生活在理想的世界中。

    我发现可行的方法是将所有私有变量放在一个私有对象中——比如model,然后有一个 getter 函数来访问它的任何属性。编译指令后,任何 jasmine 测试都可以访问范围。

    angular.module('myApp').directive('myDir', [function() {
    
    return {
        restrict: 'A',
        scope: {
    
        },
        link: function(scope, element) {
            var model = {
                myPrivateVar: 'myValue'
            };
    
            model.myPrivateFunction = function(arg) {
                // work with arg
            };
    
            scope.getVal = function(prop, args) {
                // Getter function to access any private variables
                if (model.hasOwnProperty(prop)) {
                    // If the requested var exists, return it.
                    return args ? model[prop](args) : model[prop];
                }
                return null;
            };
    
        }
    };
    }]);
    

    我仍然对这个解决方案不太满意,但它现在可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 2014-05-23
      • 2014-08-06
      • 1970-01-01
      • 2015-06-12
      相关资源
      最近更新 更多