2014-06-19 8 views
8

मैं इकाई नियंत्रक का परीक्षण कर रहा हूं और मैं एक ईवेंट हैंडलर का परीक्षण करना चाहता हूं। मान लें कि मेरा नियंत्रक इस तरह दिखता है:

myModule.controller('MasterController', ['$scope', function($scope){ 
    $scope.$on('$locationChangeSuccess', function() { 
     $scope.success = true; 
    }); 
}]); 

क्या मैं इसे अपने जैस्मीन परीक्षण में प्रसारित करूंगा? क्या मैं इसे छोड़ दूंगा? क्या एक स्वीकार्य मानक है?

+0

क्या आपने मेरा समाधान करने की कोशिश की है? – glepretre

+0

आपने इसका परीक्षण कैसे किया, @MailmanOdd? – chepukha

+0

मैंने अभी अपना समाधान जोड़ा/स्वीकार कर लिया है, उम्मीद है कि यह मदद करता है। –

उत्तर

13

समाधान मैं के साथ आया था निम्नानुसार है:

describe('MasterController', function() { 
    var $scope, $rootScope, controller, CreateTarget; 

    beforeEach(function() { 
     inject(function($injector) { 
      $rootScope = $injector.get('$rootScope'); 
      $scope = $rootScope.$new(); 

      var $controller = $injector.get('$controller'); 

      CreateTarget = function() { 
       $controller('MasterController', {$scope: $scope}); 
      } 
     }); 
    }); 

    describe('$locationChangeSuccess', function() { 
     it('should set $scope.success to true', function() { 
      controller = CreateTarget(); 
      $rootScope.$broadcast('$locationChangeSuccess'); 
      expect($scope.success).toBe(true); 
     }); 
    }); 
}); 
+0

मैं उलझन में हूं, लेकिन क्या मैंने इसका उत्तर नहीं दिया? – glepretre

+1

यह समान है लेकिन $ स्कोप कॉल कर रहा है। $ पाचन अनावश्यक था। असल में मेरे आवेदन में (इस सरलीकृत प्रश्न से अलग) यह वास्तव में मुद्दों का कारण बन रहा था। साथ ही, मेरा मानना ​​है कि मैंने आपकी पोस्ट देखने से पहले समस्या हल की है और फिर कभी प्रश्न की जांच नहीं की - क्षमा करें! –

4

मुझे नहीं लगता कि वहाँ है "एक स्वीकृत मानक" लेकिन $location source code के अनुसार घटना प्रसारित किया जाता है, तो मैं इस व्यवहार को नकली और इसे इस तरह का परीक्षण होगा:

'use strict'; 

describe('MasterController', function() { 
    var MasterController, 
     $rootScope, 
     $scope; 

    beforeEach(module('myModule')); 

    beforeEach(inject(function($rootScope, $injector, $controller) { 
    $rootScope = $rootScope; 
    $scope = $rootScope.$new(); 
    MasterController = $controller('MasterController', { 
     '$scope': $scope 
    }); 
    $scope.$digest(); 
    })); 

    describe('$locationChangeSuccess event listener', function() { 
    it('should set $scope.success to true', function() { 
     var newUrl = 'http://foourl.com'; 
     var oldUrl = 'http://barurl.com' 

     $scope.$apply(function() { 
     $rootScope.$broadcast('$locationChangeSuccess', newUrl, oldUrl); 
     }); 

     expect($scope.success).toBe(true); 
    }); 
    }); 
}); 
+0

धन्यवाद। मेरा दिन बचाया –

संबंधित मुद्दे