2013-04-01 10 views
26

में निर्देश इकाई परीक्षण में एक सेवा को इंजेक्ट कैसे करें मुझे कुछ निर्देशों की जांच करने की आवश्यकता है जो कुछ इंजेक्शन सेवाओं को कॉल करते हैं। कोड का निम्नलिखित भाग एक उदाहरण निर्देश है, जो घटनाओं के लिए सुनता है, और यदि निर्दिष्ट तत्व के अंदर दर्ज किया जाता है तो ब्राउजर को रीडायरेक्ट करता है।AngularJS

संपादित करें: मुझे लगता है कि मैं ई 2 ई परीक्षण भूमि में wading हो सकता है?

angular.module('fooApp') 
    .directive('gotoOnEnter', ['$location', function ($location) { 

    var _linkFn = function link(scope, element, attrs) { 

     element.off('keypress').on('keypress', function(e) { 
        if(e.keyCode === 13) 
        { 
         $location.path(scope.redirectUrl); 
        } 
       }); 
    } 

    return { 
     restrict: 'A', 
     link: _linkFn 
    }; 
    }]); 

समस्या यह है कि मैं पता लगा नहीं किया है निर्देशों में उन पर जासूसी करने के लिए सेवाओं इंजेक्षन करने के लिए कैसे है।

मेरे प्रस्तावित समाधान इस तरह दिखता है: यह काम नहीं करता है, के रूप में उम्मीद है, क्योंकि मैं सफलतापूर्वक पर जासूसी करने के एक $locacion सेवा इंजेक्षन करने में कामयाब नहीं किया है।

describe('Directive: gotoOnEnter', function() { 
    beforeEach(module('fooApp')); 

    var element; 

    it('should visit the link in scope.url when enter is pressed', inject(function ($rootScope, $compile, $location) { 

    element = angular.element('<input type="text" goto-on-enter>'); 
    element = $compile(element)($rootScope); 

    $rootScope.redirectUrl = 'http://www.google.com'; 
    $rootScope.$digest(); 

    var e = jQuery.Event('keypress'); 
    e.keyCode = 13; 
    element.trigger(e); 

    spyOn($location, 'path'); 

    expect($location.path).toHaveBeenCalledWith('http://www.google.com'); 
    })); 

यह

Expected spy path to have been called with [ 'http://www.google.com' ] but it was never called. 
+0

आप नेविगेट करने के लिए प्रयास करने से पहले जासूस बनाना होगा। मेरा मानना ​​है कि यदि आप कॉल के शीर्ष पर 'spyOn' पर कॉल ले जाते हैं, तो यह इरादे के रूप में काम करेगा। प्रलेखन के लिए –

उत्तर

35

पैदावार को सजाने के लिए, ठूंठ, mocks प्रदान करने या किसी भी सेवा को ओवरराइड, आप $provide सेवा का उपयोग कर सकते हैं। $provide.value, $provide.decorator आदि प्रलेखन here

तो फिर तुम इस तरह सामान कर सकते हैं:

var $location; 

beforeEach(function() { 
    module('studentportalenApp', function($provide) { 
     $provide.decorator('$location', function($delegate) { 

     $delegate.path = jasmine.createSpy(); 

     return $delegate; 
     }); 
    }); 

    inject(function(_$location_) { 
     $location = _$location_; 
    }); 

    }); 

...

it('should visit the link in scope.redirectUrl when enter is pressed', inject(function ($rootScope, $compile, $location) { 
    element = angular.element('<input type="text" goto-on-enter>'); 
    element = $compile(element)($rootScope); 

    $rootScope.redirectUrl = 'http://www.google.com'; 
    $rootScope.$digest(); 

    var e = jQuery.Event('keypress'); 
    e.keyCode = 13; 
    element.trigger(e); 

    $rootScope.$digest(); 

    expect($location.path).toHaveBeenCalledWith('http://www.google.com'); 

})); 
+0

यूआरएल बदल गया है: https://docs.angularjs.org/api/auto/object/$provide – primavera133

+0

फिर से बदला गया: https://docs.angularjs.org/api/auto/service/$provide –