Come avere valori di ritorno diversi per più chiamate su una spia Jasmine


100

Diciamo che sto spiando un metodo come questo:

spyOn(util, "foo").andReturn(true);

La funzione sotto test chiama util.foopiù volte.

È possibile che la spia ritorni truela prima volta che viene chiamata, ma che ritorni falsela seconda volta? O c'è un modo diverso per farlo?

Risposte:


163

Puoi usare spy.and.returnValues (come Jasmine 2.4).

per esempio

describe("A spy, when configured to fake a series of return values", function() {
  beforeEach(function() {
    spyOn(util, "foo").and.returnValues(true, false);
  });

  it("when called multiple times returns the requested values in order", function() {
    expect(util.foo()).toBeTruthy();
    expect(util.foo()).toBeFalsy();
    expect(util.foo()).toBeUndefined();
  });
});

C'è qualcosa a cui devi stare attento, c'è un'altra funzione che farà un incantesimo simile returnValuesenza s, se lo usi, jasmine non ti avviserà.


20
+1: questa è una caratteristica eccellente. Un avvertimento, però - fai attenzione a non dimenticare la 's' in .returnValues- le due funzioni sono ovviamente diverse, ma passare più argomenti a .returnValuenon genera un errore. Non voglio ammettere quanto tempo ho perso a causa di quel personaggio.
— Il DIMM Reaper

@TheDIMMReaper, grazie. Ne parlo adesso.
— Ocean

Farlo nel prima di ogni cosa era importante per me, non nel test (it)
— Ian

Non c'è bisogno di preoccuparsi degli errori di ortografia quando si utilizza jasmine in TypeScript, ovviamente.
— Warlike Chimpanzee

27

Per le versioni precedenti di Jasmine, puoi utilizzare spy.andCallFakeJasmine 1.3 o spy.and.callFakeJasmine 2.0 e dovrai tenere traccia dello stato "chiamato", tramite una semplice chiusura o proprietà dell'oggetto, ecc.

var alreadyCalled = false;
spyOn(util, "foo").andCallFake(function() {
    if (alreadyCalled) return false;
    alreadyCalled = true;
    return true;
});

4
Possiamo estenderlo per più di 2 chiamate in questo modo: var results = [true, false, "foo"]; var callCount = 0; spyOn (util, "foo"). and.callFake (function () {restituisce risultati [callCount ++];});
— Jack

1
Questo può essere esteso a una funzione generica in questo modo: function returnValues ​​() {var args = arguments; var callCount = 0; funzione di ritorno () {return args [callCount ++]; }; }
— Tomas Lieberkind

Perché tutto questo codice quando puoi semplicemente restituire results.shift ()?
— ThaFog

che ne dici di quando torniamo osservabvles
— Lijo

questa opzione è più flessibile, poiché possiamo generare un errore o restituire un valore a seconda dell'ordine di chiamata.
— 0bj3ct
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.