Tests unitaires angulaires 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'essaie 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 faire?

36
demandé sur emersonthis 2015-03-03 02:41:10

5 réponses

Vous pouvez simplement l'écraser

updateService.getUpdate = jasmine.createSpy().and.returnValue(etc)
51
répondu Peter Ashwell 2015-03-03 00:02:25

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);        
17
répondu Javier Candalaft-CONT 2016-01-22 15:44:42

La réponse verte cochée n'a pas fonctionné pour moi, mais cela a fonctionné:

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

Votre test jasmine s'exécutera mais lorsque vous lancerez votre application typescript vous criera fort si vous ne mettez pas une chaîne aléatoire et une fonction vide comme arguments à createSpy().

2
répondu rb1econ 2017-05-11 19:59:53

Un moyen plus facile est simple

updateService.getUpdate.and.returnValue(Observable.of({status:true}));
1
répondu Aniruddha Das 2018-04-27 18:55:53

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 avez accès au premier Espion. Attention, il retournera l'Espion précédent, si l'un est déjà actif.

spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
...
spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
0
répondu André Werlang 2017-11-24 18:33:37