86 votes

Comment effacer les espions de manière programmatique dans Jasmine ?

Comment effacer l'espion dans une suite de test jasmine de manière programmatique ? Merci.

beforeEach(function() {
  spyOn($, "ajax").andCallFake(function(params){
  })
})

it("should do something", function() {
  //I want to override the spy on ajax here and do it a little differently
})

4 votes

Vous êtes sûr d'avoir choisi la bonne réponse "correcte" ?

6voto

Hamzeen Hameem Points 716

À partir de jasmine 2.5, vous pouvez utiliser ce paramètre global pour mettre à jour un espion dans vos scénarios de test :

jasmine.getEnv().allowRespy(true);

1voto

RafaCianci Points 11

Ou vous pouvez le faire

describe('test', function() {
    var a, c;
    c = 'spy1';
    a = {
      b: function(){}
    };

    beforeEach(function() {
        spyOn(a, 'b').and.callFake(function () {
             return c;
        });
    })

    it('should return spy1', function() {
        expect(a.b()).toEqual('spy1');
    })

    it('should return spy2', function() {
        c = 'spy2';
        expect(a.b()).toEqual('spy2');
    })

})

Dans ce cas, vous utilisez le même Spy mais changez juste la var qu'il retournera

1voto

LHM Points 179

Je publie cette réponse pour répondre au commentaire du code de l'OP @Tri-Vuong - qui était la raison principale de ma visite sur cette page :

Je veux passer outre l'espion ... ici et le faire un peu différemment.

Aucune des réponses données jusqu'à présent n'aborde ce point. Je vais donc publier ce que j'ai appris et résumer également les autres réponses.

@Alissa l'a dit correctement quand elle a expliqué pourquoi c'est une mauvaise idée de fixer isSpy à false - espionnage effectif d'un espion, ce qui a pour conséquence que le comportement d'autodestruction de Jasmine ne fonctionne plus comme prévu. Sa solution (placée dans le contexte de l'OP et mise à jour pour Jasmine 2+) était la suivante :

beforeEach(() => {
  var spyObj = spyOn(obj,'methodName').and.callFake(function(params){
  }) // @Alissa's solution part a - store the spy in a variable
})

it("should do the declared spy behavior", () => {
  // Act and assert as desired
})

it("should do what it used to do", () => {
  spyObj.and.callThrough(); // @Alissa's solution part b - restore spy behavior to original function behavior
  // Act and assert as desired
})

it("should do something a little differently", () => {
  spyObj.and.returnValue('NewValue'); // added solution to change spy behavior
  // Act and assert as desired
})

La dernière it Le test démontre comment on peut changer le comportement d'un espion existant en quelque chose d'autre que le comportement original : " and -déclare" le nouveau comportement sur le spyObj précédemment stocké dans la variable de l'objet beforeEach() . Le premier test illustre mon cas d'utilisation : je voulais qu'un espion se comporte d'une certaine manière pour la plupart des tests, mais qu'il change ensuite pour quelques tests.

Pour les versions antérieures de Jasmine, changez les appels appropriés à .andCallFake( , .andCallThrough() y .andReturnValue( respectivement.

-3voto

Andreas Köberle Points 16453

Je ne suis pas sûr que ce soit une bonne idée, mais vous pouvez simplement définir le paramètre isSpy de la fonction à false :

describe('test', function() {
    var a = {b: function() {
    }};
    beforeEach(function() {
        spyOn(a, 'b').andCallFake(function(params) {
            return 'spy1';
        })
    })
    it('should return spy1', function() {
        expect(a.b()).toEqual('spy1');
    })

    it('should return spy2', function() {
        a.b.isSpy = false;
        spyOn(a, 'b').andCallFake(function(params) {
            return 'spy2';
        })
        expect(a.b()).toEqual('spy2');
    })

})

Mais peut-être est-il préférable de créer une nouvelle suite pour ce cas où vous avez besoin d'un autre comportement de votre espion.

-3voto

Il suffit de mettre la méthode d'espionnage à null

mockedService.spiedMethod = null;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X