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?
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);
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);
Un moyen plus simple est de simplifier
updateService.getUpdate.and.returnValue(Observable.of({status:true}));
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()
.
Une autre option:
(yourService.method as jasmine.Spy).and.returnValue(value);