2013-10-18 19 views
20

Wie kann ich testen, ob der Bereich nach der Übertragung gefüllt ist? Ich habe hier ein paar QA's im Stackexchange gesucht und gefunden, aber keine hat mein Problem beantwortet. Der Code funktioniert gut, ich weiß nicht, wie ich ihn testen soll. Darf ich hinzufügen, dass ich ein Neuling zum Testen bin und besonders mit Jasmine.

So, hier ist der Code:

Dienst CrappySvc:

update: function() { 
    $rootScope.$broadcast('updatecrappy', Crappy.query()); 
} 

-Controller GetCrappyCtrl:

$scope.$on('updatecrappy', function(event, crap) { 
    $scope.crap = crap; 
    }); 

Jasmin:

beforeEach(inject(function($rootScope, $httpBackend, $controller, Crappy) { 
    rootScope = $rootScope; 
    scope = $rootScope.$new(); 
    Crappy = mockCrappy; 

     ... 
    spyOn(rootScope, '$broadcast'); 
     ... 

    ctrl = $controller('GetCrappyCtrl', { 
    $scope : scope, 
    Crappy : mockCrappy 
});    

}));

});

Stein

+0

Ich fand das auch hilfreich: http://stackoverflow.com/questions/15272414/how-can-i-test-events-in-angular – Ben

Antwort

36

Sie müssen Jasmin sagen den Spion Anruf der tatsächlichen $ Broadcast-Funktion

spyOn($rootScope, '$broadcast').andCallThrough(); 

lassen Wenn Sie den Spion nichts tut nicht andCallThrough() verwenden.

Jasmine Docs

EDIT

Mit Jasmin 2 würde die Syntax

spyOn($rootScope, '$broadcast').and.callThrough(); 
+0

können wir näher erläutern, was das eigentlich macht? – iamwhitebox

+0

@whitebox Das ist die Sache, es macht nicht wirklich viel. Standardmäßig ersetzen Jasmins Spione die ursprüngliche Funktion, die ausspioniert wird. Der Aufruf von 'and.callThrough()' wird zum Standardverhalten hinzugefügt und bewirkt, dass der Spion * auch * die ursprüngliche Funktion aufruft, die ausspioniert wurde. Und das ist wirklich alles, was es tut. – ivarni

+0

Sie brauchen nicht die and.callThrough() in diesem Fall, wenn Sie gerade behaupten, die Sendung hieß –

0

werden, wenn die returnValue von $scope.$broadcast() zu fälschen wollen Sie so etwas wie diese beiden Fälle tun können:

Fall 1:

scope.$broadcast('TEST_CHANGED', {test: 'test1'}); 
spyOn(scope, '$broadcast').and.callThrough(); 
expect(something).toEqual('something'); 

Fall 2:

scope.$broadcast('TEST_CHANGED', {test: 'test2'}); 
spyOn(scope, '$broadcast').and.callThrough(); 
expect(something2).toEqual('something2'); 
0

Was "toHavebeenCalled" betrifft, gibt es keine Notwendigkeit von "andCallThrough()". Einfacher Spion würde funktionieren. In Ihrem Fall sind Ihre Argumente anders.

Du Rundfunk wie, rootScope $ Broadcast ('updatecrappy', [{id: 2, Name: 'beschissen'}]).

Aber Sie erwarten:

erwarten (rootScope $ Sendung.) .toHaveBeenCalledWith ('updscenes', [{id: 2, Name: 'beschissen'}]);

Blick auf Argumente "updarecrappy" aber in tohavebeencalled es "updscenes".

0

Sehen Sie sich den Beispielcode unten an, es funktioniert gut für mich.

Auslösen des Beispielereignisses 'onTimeChanged' aus $ rootScope. Mein Controller hat einen Listener 'onTimeChanged' und ich rufe eine Methode timeChanged() auf.

describe('onTimeChanged()', function() { 
    it('should call another method or controller', function() { 
     spyOn(searchCtrl, 'timeChanged'); 
     $rootScope.$emit('onTimeChanged'); 
     expect(searchCtrl.timeChanged).toHaveBeenCalled(); 
    }); 
}); 

Beachten Sie, dass ich die Methode '$ emit' von rootScope nicht ausspioniert habe.

Verwandte Themen