2014-01-10 118 views
5

如何对像下面的myFunc这样的指令中定义的函数进行单元测试?单元测试AngularJS指令中的私有函数

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

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

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

     } 
    }; 
    }]); 

或者你如何定义我不想在指令之外公开的可测试指令特定函数?

回答

6

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

你已经声明你不想暴露在指令之外,但是当然另一种选择是将这个逻辑提取到一些服务myDirService并在那里执行你的逻辑。在这种情况下,你可以单独测试。

+1

我只提到这种方法,因为我无法模拟具有适当值的事件。我知道e2e测试可能是最好的测试,但我也想对它进行一些单元测试。我试图模拟的事件是文件输入上的“change”事件。我的指令在听,我无法让事件对象拥有适当的目标和文件。我想我应该在单独的问题中提出这个问题,谢谢你的解释。 – mkhatib

1

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

我发现的作品的方式是将所有私人变量放在一个私人对象中 - 比如model,然后有一个getter函数来访问它的任何属性。一旦编译指令,范围可以从任何茉莉花测试中获得。

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

    } 
}; 
}]); 

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