2014-01-10 55 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; 
     }; 

    } 
}; 
}]); 

我對這個解決方案仍然不滿意,但它現在可行。