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?
5 réponses
Vous pouvez simplement l'écraser
updateService.getUpdate = jasmine.createSpy().and.returnValue(etc)
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);
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()
.
Un moyen plus facile est simple
updateService.getUpdate.and.returnValue(Observable.of({status:true}));
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);