web-dev-qa-db-fra.com

Angular test unitaire avec Jasmine: comment supprimer ou modifier spyOn

AngularJS v1.2.26

Jasmine v2.2.0

Comment puis-je modifier ou supprimer le comportement d'un spyOn? Lorsque j'essaye de le remplacer, j'obtiens l'erreur suivante: Error: getUpdate has already been spied upon

var data1 = 'foo';
var data2 = 'bar';

describe("a spec with a spy", function(){

    beforeEach(module('app'));

    var $q;

    beforeEach(inject(function(_updateService_, _$q_){
        updateService = _updateService_;

        //spy the results of the getUpdate()
        $q = _$q_;
        var deferred = $q.defer();
        deferred.resolve( data1 );
        spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);

    }));

    describe('and here the spy should be different', function() {

        it('returns a different value', function() {

          var deferred = $q.defer();
          deferred.resolve( data2 );
          spyOn(updateService, 'getUpdate'); //ERROR HERE
          updateService.getUpdate.and.returnValue(deferred.promise);

          ...

        });
    });

...

Lorsque je supprime le deuxième spyOn, le test ne fonctionne pas.

Comment puis-je faire cela?

47
emersonthis

Vous pouvez simplement l'écraser

updateService.getUpdate = jasmine.createSpy().and.returnValue(etc)
62
Peter Ashwell

Vous pouvez remplacer la valeur de retour de l'espion

    var deferred = $q.defer();
    deferred.resolve( data1 );

    var getUpdateSpy = spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);



    var newDeferred = $q.defer();
    newDeferred.resolve( data2 );

    getUpdateSpy.and.returnValue(newDeferred.promise);        
22

Depuis jasmine v2.5, utilisez le paramètre global allowRespy().

jasmine.getEnv().allowRespy(true);

Vous pourrez appeler spyOn() plusieurs fois, lorsque vous ne voulez pas et/ou n'avez pas accès au premier espion. Attention, il renverra l'espion précédent, s'il en existe déjà un.

spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
...
spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
8
André Werlang

Un moyen plus simple est de simplifier

updateService.getUpdate.and.returnValue(Observable.of({status:true}));
3
Aniruddha Das

la réponse verte cochée ne fonctionnait pas pour moi, mais cela a:

yourCoolService.createThing = jasmine.createSpy('notreal', function(){}).and.returnValue();

votre test de jasmin s'exécutera, mais lorsque vous allez lancer votre application, TypeScript vous hurlera fort si vous ne mettez pas une chaîne aléatoire et une fonction vide comme arguments dans createSpy().

2
rb1econ

Une autre option:

(yourService.method as jasmine.Spy).and.returnValue(value);
0
Justas