2013-04-01 18 views
26

Bir yönerge birim testinde bir hizmet nasıl enjekte edilir Bazı enjekte edilen servislere yapılan bazı çağrıları yapan bir yönergeyi test etmem gerekiyor. Aşağıdaki kod parçası, olayları dinleyen ve belirtilen bir öğenin içine enter tuşuna basıldığında tarayıcıyı yönlendiren örnek bir direktiftir.AngularJS

Düzenleme: E2E test arazisinde yattığımı hissedebiliyorum?

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 
    }; 
    }]); 

sorun Ben direktifleri onlara casusluk servisleri enjekte nasıl çözemedim olmasıdır.

Benim çözüm önerisi şöyle görünür: beklendiği gibi ben gözetlemek için başarılı bir $locacion hizmeti enjekte yönetilen değil çünkü, çalışmıyor .

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'); 
    })); 

Bu, saplama süslemeleri mocks sağlamak veya herhangi bir hizmeti geçersiz kılmak için

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

. Gördüğünüz zaman, 'spyOn' çağrısını işlevin üstüne taşırsanız, amaçlanan şekilde çalışacağına inanıyorum. –

cevap

35

verir, sen $provide hizmetini kullanabilirsiniz. $provide.value, $provide.decorator vs. Dokümantasyon here.

Sonra böyle şeyler yapabilirsiniz: gezinmeyi denemeden önce casus oluşturmak için gereken

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

dökümantasyon url değişti: https://docs.angularjs.org/api/auto/object/$provide – primavera133

+0

Yine değiştirildi: https://docs.angularjs.org/api/auto/service/$provide –