2013-05-13 97 views
1

根據AngularJS DOC A /指令控制器是:如何嘲笑所需指令控制器在指令UT

預鏈接階段之前實例化,並且如果他們的名字要求其它與其他指令共享(請參閱require屬性)。這允許指令相互溝通並增強彼此的行爲。

這聽起來不錯,並在用戶界面視圖是由容器和插件的情況下是有用的,widget的鏈接FUNC可以在容器中的指令控制器通過聲明的方式require:^cotnainerDirective通過。這給出了回調容器行爲的替代方式,而不是依賴於事件的通信。

例如,其作爲下面需要容器控制器的微件的指令:如果所述窗口小部件是生活在容器內

angular.module('platform').directive('widget', [ function () { 
    return { 
     restrict: 'E', 
     transclude: true, 
     require: '?^container', 
     replace: true, 
     scope: { 
      layout: '=', 
      model: '=' 
     }, 
     templateUrl: 'js/modules/platform/templates/form-tmpl.html', 
     link: function (scope, element, iAttrs, requiredCtrl) { 
      if(requiredCtrl && requiredCtrl.fooMethod){ 
       .... 
      } 
     } 
    }; 
}]); 

鏈接函數內的代碼會做額外的工作。代碼工作正常。但是,在對單元測試widget指令進行測試時,很難想出發送模擬容器指令控制器的好方法,因爲它不是通過Angular $注入器服務注入的。

也許,我需要從容器的角度來編寫UT,但這種方式涉及到引導容器指令所需的太多準備工作。任何人都會遇到此問題,並可以在這裏分享一些優點?

+0

[應該在其標題中包含「標籤」嗎?](http://meta.stackexchange.com/a/130208/218539)可能不是。 – timss 2013-05-13 02:25:34

+0

好聽。你可以發佈這個答案並接受它,這樣問題可以被標記爲解決:-) – timss 2013-05-15 17:30:13

回答

0

事實證明,如果我想單元測試widget指令,它必須與容器鬆散分離,在這種情況下使用「require」不是一個好主意,因爲它實際上使得widget指令緊緊地依賴於容器。我已經改變了我的設計,使用事件驅動的通信btw小部件和容器,這樣我可以簡單地模擬事件監聽器來觀察UT中的widget指令發送的事件。