2013-04-15 16 views
7

Bir süredir boşuna bir hizmeti test etmeye çalışıyorum ve bir miktar yardım etmeyi umuyordum. Ben hizmet buAngularJS servis atamalarının içinde hizmet alayının enjekte edilmesi

myModule.factory('myService', ['$rootScope', '$routeParams', '$location', function($rootScope, $routeParams, $location) { 

    var mySvc = { 
    params: {} 
    } 

    // Listen to route changes. 
    $rootScope.$on('$routeUpdate', mySvc.updateHandler); 

    // Update @params when route changes 
    mySvc.updateHandler = function(){ ... }; 

    ... 
    ... 

    return mySvc; 

}]); 

gibi küçük seyir var

Ve ben test edebilirsiniz yani benim testlerde enjekte alır hizmete önce 'myService' enjekte hizmetlerini alay etmek istiyorum: İşte benim durum başlatma kodu Tetkikler ve mocks için Jasmine'i kullanıyorum

var mySvc = { 
    params: {} 
    } 

    // Listen to route changes. 
    $rootScope.$on('$routeUpdate', mySvc.updateHandler); 

altında. Bu, şu an için geldiğim şeydi. Benim rootscope alayım orijinalin yerine geçmiyor ve Bağımlılık Enjeksiyon doktoru beni her şeyden çok karıştırıyor.

cevap

7

yerine kendi özel nesne enjekte çalışmakla gerçek $ rootScope gözetlemek olur yardım edin.

var target, rootScope; 
beforeEach(inject(function($rootScope) { 
    rootScope = $rootScope; 

    // Mock everything here 
    spyOn(rootScope, "$on") 
})); 

beforeEach(inject(function(myService) { 
    target = myService; 
})); 

it('should have called rootScope.$on', function(){ 
    expect(rootScope.$on).toHaveBeenCalled(); 
}); 

Bunu CoffeScript'te denedim, ancak yukarıdaki kod hala çalışmalıdır. Bunu enjekte ardından RootController oluşturup olabilir

+0

Çok teşekkürler! Bir çekicilik gibi çalıştı. Bunu daha önce denemediğime inanamıyorum. –

+0

spyOn (rootScope, "$ on") üzerinde spyOn (rootScope, "$ on") değerine değişiklik yapmak zorunda kaldım ve CallThrough(); ama harika çalıştı ve doğru yöne gitmemi sağladı. – blackmind

0

:

inject(function(myService, $controller){ 
    target = myService; 
    $controller('rootController', { 
     $scope : $rootScope.$new(), 
     $rootScope : myService 
    }); 
}); 

size 'MyService' dan $ rootScope işlevlerini erişebilirsiniz Bu yaklaşımla; Böylelikle 'myService. $ On()'

Sadece yaptım, yardım gerekiyorsa bildirin.

İlgili konular