2016-10-10 13 views
7

मुझे निर्देशक पर अपने नियंत्रक तक पहुंचने में कुछ समस्याएं आ रही हैं कि मैं जैस्मीन और कर्म परीक्षक के साथ यूनिट परीक्षण करने की कोशिश कर रहा हूं।एंगुलरजेएस निर्देशक नियंत्रक तक पहुंच

निर्देश

angular.module('Common.accountSearch',['ngRoute']) 

    .directive('accountSearch', [function() { 
     return { 
      controllerAs: 'ctrl', 
      controller: function ($scope, $element, $routeParams, $http) { 

       this.setAccount = function() { 
        var response = { AccountId : $scope.ctrl.searchedAccount.AccountId } 
        $scope.callback(response) 
       } 


       this.getAccounts = function(searchText){ 
        return $http.get('/api/CRMAccounts', { 
         params: { 
          retrievalLimit: 10, 
          search: searchText 
         } 
        }).then(function(response){ 
         return response.data; 
        }); 

       } 

      }, 
      scope : { 
       config : '=', 
       values : '=', 
       callback : '=' 
      }, 
      templateUrl : '/common/components/account-search/account-search.html', 
      restrict : 'EAC' 
     } 
    }]); 

यह यहाँ परीक्षण का मामला फ़ाइल है अब तक मेरा मानना ​​है कि सभी है आदेश और सही (मुझे आशा है) में:

परीक्षण का मामला फ़ाइल:

निर्देश इस तरह दिखता है
describe("Account search directive logic tests", function(){ 
    var element,$scope,scope,controller,template 

    beforeEach(module("Common.accountSearch")) 


    beforeEach(inject(function (_$compile_, _$rootScope_,_$controller_,$templateCache) { 
    template = $templateCache.get("components/account-search/account-search.html") 
    $compile = _$compile_; 
    $rootScope = _$rootScope_; 
    $controller = _$controller_; 
    scope = $rootScope.$new(); 
    element = $compile(template)(scope) 
    ctrl = element.controller 
    scope.$digest(); 
    // httpBackend = _$httpBackend_; 
    })); 




    it(" sets the account and calls back.", inject(function() { 

    console.log(ctrl) 
    expect(ctrl).toBeDefined() 
    })); 
    //httpBackend.flush() 
}); 

मैं निर्देश (मुझे लगता है कि) सांत्वना जो निम्नलिखित अस्पष्ट संदेश देता है के नियंत्रक मुद्रित करने के लिए कामयाब रहे:

LOG: function (arg1, arg2) { ... } 

मैं निर्देश पर किसी भी कार्य या गुणों तक नहीं पहुंच सकता क्योंकि वे सभी "अपरिभाषित" लौट रहे हैं, मैं क्या गलत कर रहा हूं?

+0

आप इस तरह उस तक पहुँच सकते होगा ' – Kliment

+0

scope.ctrl' मैं इसे नियंत्रक की आसान यह खुद फ़ाइल है, कि आप शायद एक निर्देश – Maccurt

+0

मैं के संदर्भ के बिना आसान परीक्षण कर सकते हैं scope.ctrl की कोशिश की है, यह मुट्ठी चीजों में से एक था और यह काम नहीं किया – nagrom97

उत्तर

3

निर्देशकों के लिए नियंत्रक वास्तव में पूरी तरह इंजेक्शन योग्य हैं - एक निर्माता प्रदान करने के बजाय, आप केवल नियंत्रक को नाम से संदर्भित कर सकते हैं। यहाँ कोणीय के लिए निर्देश परिभाषा वस्तु डॉक्स देखें: https://docs.angularjs.org/api/ng/service/ $ संकलन # निर्देश परिभाषा-वस्तु

आपके मामले में जहां इकाई परीक्षण करने के लिए नियंत्रक आप इसे इस प्रकार बस करो चाहते हैं:

आम। accountSearch.js

angular.module('Common.accountSearch', []) 
    .directive('accountSearch', [function() { 
     return { 
      controller: 'accountSearchCtrl', 
      scope: { 
       config : '=', 
       values : '=', 
       callback : '=' 
      }, 
      templateUrl : '/common/components/account-search/account-search.html', 
      restrict: 'EAC' 
     } 
    }]) 
    .controller('accountSearchCtrl', ['$scope', function ($scope) { 
     $scope.setAccount = function() { 
      var response = { 
       AccountId: $scope.ctrl.searchedAccount.AccountId 
      }; 
      $scope.callback(response); 
     } 

     $scope.getAccounts = function (searchText) { 
      // Code goes here... 
     } 
    }]); 

common.accountSearch-spec.js

describe("Account search directive logic tests", function() {  
    var controller, scope; 

    beforeEach(module("Common.accountSearch")); 

    beforeEach(inject(function (_$controller_, _$rootScope_) {   
     $rootScope = _$rootScope_; 
     scope = $rootScope.$new(); 
     controller = _$controller_('accountSearchCtrl', { '$scope': scope });   
    })); 

    it(" sets the account and calls back.", function() { 
     expect(controller).toBeDefined(); 
    }); 
}); 

इस तरह आप अपने नियंत्रक को सीधे अपने जैस्मीन परीक्षणों में इंजेक्ट कर सकते हैं जैसे कि आपके किसी भी अन्य नियंत्रक।

उम्मीद है कि इससे मदद मिलती है।

+0

Ive ने यह कोशिश की और यह काम नहीं करता है। क्या आप एक उदाहरण जोड़ सकते हैं? – dopatraman

+0

हम्म, अनुमान है कि मैंने कहीं गलती की है। जब मुझे पंद्रह मिनट मिलते हैं, तो मैं एक कामकाजी पहेली को फेंक दूंगा, और अपना जवाब अपडेट करूंगा। – s3raph86

+0

ठीक है, मैंने अपना जवाब परीक्षण और अद्यतन किया है। सरल बनाने के लिए, मैंने नियंत्रक से कुछ निर्भरताओं को हटा दिया, लेकिन आप अपने मॉक्स और चश्मा विकसित करने के साथ ही उन्हें एक-एक करके वापस जोड़ सकते हैं। उपर्युक्त निश्चित रूप से खाते SearchCtrl को spec में और निर्देश में इंजेक्ट करेगा, जो आपके निर्देशक के नियंत्रक को परीक्षण करने की इकाई की आवश्यकता को पूरा करेगा। – s3raph86

0

element.controller AngularJS jqLite के लिए एक अतिरिक्त विधि है, इसलिए जब आप इसे लॉग करते हैं तो आप jqLite विधि .toString() देखते हैं। आपको इसे कॉल करना चाहिए और निर्देशक नियंत्रक प्राप्त करना चाहिए। Element controller manual

4

तो बंद करें!

element.controller एक फ़ंक्शन है और उस निर्देश का नाम पारित करने की आवश्यकता है जिसे आप नियंत्रक प्राप्त करने का प्रयास कर रहे हैं। इस मामले में यह

ctrl = element.controller("accountSearch");
संबंधित मुद्दे