2013-04-15 10 views
7

Ich habe schon einige Zeit versucht, einen Dienst ohne Erfolg zu testen und habe auf etwas Hilfe gehofft. Hier ist meine Situation:AngularJS inject service mock in service tests

Ich habe ein Service suchen ein wenig wie diese

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; 

}]); 

Und ich möchte die Dienste in 'myService', bevor der Dienst injiziert verspotten in meinen Tests injiziert wird, damit ich das testen kann Initialisierungscode unter

var mySvc = { 
    params: {} 
    } 

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

ich bin mit Jasmin für Tests und spottet. Dies ist, was ich mit jetzt kam für

describe('myService', function(){ 
    var rootScope, target; 
    beforeEach(function(){ 
    rootScope = jasmine.createSpyObj('rootScope', ['$on']); 

    module('myModule'); 
    angular.module('Mocks', []).service('$rootScope', rootScope); 
    inject(function(myService){ 
     target = myService; 
    });   
    }); 

    it('should be defined', function(){ 
    expect(target).toBeDefined(); 
    }); 

    it('should have an empty list of params', function(){ 
    expect(target.params).toEqual({}); 
    }); 

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

Dies allerdings nicht funktioniert. Mein Rootscope-Mock ersetzt nicht das Original, und das Dependency-Injection-Dokument verwirrt mich mehr als alles andere.

Bitte helfen

Antwort

7

ich auf dem tatsächlichen $ rootScope ausspionieren würde anstatt zu versuchen, Ihr eigenes Objekt zu injizieren.

Ich habe dies in CoffeScript getestet, aber der obige Code sollte noch funktionieren

+0

Vielen Dank! Lief wie am Schnürchen. Ich kann nicht glauben, dass ich das vorher nicht versucht habe. –

+0

Ich musste die Änderung spyOn (rootScope, "$ on") zu spyOn (rootScope, "$ on") hinzufügen undCallThrough(); aber funktionierte großartig und brachte mich in die richtige Richtung. – blackmind

0

Sie könnten eine RootController erstellen und dann injizieren:

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

Mit diesem Ansatz Sie $ rootScope Funktionen von Ihrem ‚myService‘ zugreifen können; Solch 'myService. $ On()'

Ich habe es gerade gemacht, lassen Sie mich wissen, wenn Hilfe benötigt wird.