单元测试AngularJS指令中的私有函数

时间:2014-01-10 08:29:29

标签: javascript unit-testing angularjs angularjs-directive

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

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

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

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

      }
    };
  }]);

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分: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;
        };

    }
};
}]);

我对这个解决方案仍然不是很满意,但它现在有效。