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.