Comment puis-je tester que la portée est remplie après la diffusion? J'ai cherché et trouvé quelques QA ici dans stackexchange, mais aucun n'a répondu à mon problème. Le code fonctionne bien, mais je ne sais pas comment le tester. Puis-je ajouter que je suis novice dans les tests, et en particulier avec Jasmine.
Alors, voici le code:
Service CrappySvc:
update: function() {
$rootScope.$broadcast('updatecrappy', Crappy.query());
}
Contrôleur 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
});
}));
it('$scope.$on should have been triggered', function() {
rootScope.$broadcast('updatecrappy', [{id : 2, name : 'crappy'}]);
expect(rootScope.$broadcast).toHaveBeenCalledWith('updscenes', [{id : 2, name : 'crappy'}]);
});
Pierre
Vous devez dire à Jasmine de laisser l'espion appeler la fonction de diffusion $
spyOn($rootScope, '$broadcast').andCallThrough();
Si vous n'utilisez pas andCallThrough()
, l'espion ne fait rien.
EDIT
Avec Jasmine 2, la syntaxe serait la suivante:
spyOn($rootScope, '$broadcast').and.callThrough();
En ce qui concerne " toHavebeenCalled ", il n'est pas nécessaire d'utiliser " etCallThrough ()". Un simple espion fonctionnerait. Dans votre cas, vos arguments sont différents.
Vous diffusez comme, par exemple, RootScope. $ Broadcast ( 'updatecrappy', [{id: 2, nom: 'crappy'}] );
Mais vous attendez:
expect (rootScope. $ broadcast) .toHaveBeenCalledWith ( 'updscenes', [{id: 2, nom: 'crappy'}]);
examinez l'argument " updarecrappy " mais pour vous appeler comme il est " updscenes ".
Regardez l'exemple de code ci-dessous, cela fonctionne bien pour moi.
Émission d'un exemple d'événement 'onTimeChanged' à partir de $ rootScope. Mon contrôleur a un écouteur 'onTimeChanged' et j'appelle une méthode timeChanged () à l'intérieur.
describe('onTimeChanged()', function() {
it('should call another method or controller', function() {
spyOn(searchCtrl, 'timeChanged');
$rootScope.$emit('onTimeChanged');
expect(searchCtrl.timeChanged).toHaveBeenCalled();
});
});
Notez que je n'ai pas espionné la méthode '$ emit' de rootScope.
Si vous voulez simuler la returnValue
de $scope.$broadcast()
, vous pouvez faire quelque chose comme ces deux cas:
Cas 1:
scope.$broadcast('TEST_CHANGED', {test: 'test1'});
spyOn(scope, '$broadcast').and.callThrough();
expect(something).toEqual('something');
Cas 2:
scope.$broadcast('TEST_CHANGED', {test: 'test2'});
spyOn(scope, '$broadcast').and.callThrough();
expect(something2).toEqual('something2');