web-dev-qa-db-fra.com

Comment tester $ scope. $ On dans AngularJS

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

20
stonerichnau

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.

Jasmine Docs

EDIT

Avec Jasmine 2, la syntaxe serait la suivante:

spyOn($rootScope, '$broadcast').and.callThrough();
36
ivarni

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 ".

0
vipul patel

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.

0
rach8garg

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');
0
KATHERINE