2015-07-21 14 views
11

Sto utilizzando una spia Jasmine (2.2.0) per verificare se viene richiamata una determinata richiamata.Ripristina chiamata su spia Jasmine non restituisce

Codice di prova:

it('tests', function(done) { 
    var spy = jasmine.createSpy('mySpy'); 
    objectUnderTest.someFunction(spy).then(function() { 
    expect(spy).toHaveBeenCalled(); 
    done(); 
    }); 
}); 

Questo funziona come previsto. Ma ora, sto aggiungendo un secondo livello:

it('tests deeper', function(done) { 
    var spy = jasmine.createSpy('mySpy'); 
    objectUnderTest.someFunction(spy).then(function() { 
    expect(spy).toHaveBeenCalled(); 
    spy.reset(); 
    return objectUnderTest.someFunction(spy); 
    }).then(function() { 
    expect(spy.toHaveBeenCalled()); 
    expect(spy.callCount).toBe(1); 
    done(); 
    }); 
}); 

Questa prova non torna mai, perché a quanto pare il done callback non viene mai chiamato. Se rimuovo la riga spy.reset(), il test termina, ma ovviamente non riesce sull'ultima aspettativa. Tuttavia, il campo callCount sembra essere undefined anziché 2.

+0

sta lanciando? –

+0

Prova ad aggiungere gestori di rifiuto per le tue promesse. – robertklep

+0

aggiunto '.catch (done)' alla fine della catena, si verifica lo stesso problema. Quindi @ Daniel, se sta lanciando non riesco a rilevarlo. – Jorn

risposta

22

La sintassi per Jasmine 2 è diversa da 1,3 rispetto alle funzioni di spionaggio. Vedere documenti Jasmine here.

In particolare si ripristina una spia con spy.calls.reset();

Questo è come il test dovrebbe essere simile:

// Source 
var objectUnderTest = { 
    someFunction: function (cb) { 
     var promise = new Promise(function (resolve, reject) { 
      if (true) { 
       cb(); 
       resolve(); 
      } else { 
       reject(new Error("something bad happened")); 
      } 
     }); 
     return promise; 
    } 
} 

// Test 
describe('foo', function() { 
    it('tests', function (done) { 
     var spy = jasmine.createSpy('mySpy'); 
     objectUnderTest.someFunction(spy).then(function() { 
      expect(spy).toHaveBeenCalled(); 
      done(); 
     }); 
    }); 
    it('tests deeper', function (done) { 
     var spy = jasmine.createSpy('mySpy'); 
     objectUnderTest.someFunction(spy).then(function() { 
      expect(spy).toHaveBeenCalled(); 
      spy.calls.reset(); 
      return objectUnderTest.someFunction(spy); 
     }).then(function() { 
      expect(spy).toHaveBeenCalled(); 
      expect(spy.calls.count()).toBe(1); 
      done(); 
     }); 
    }); 
}); 

Vedi violino here

+0

Grazie! Apparentemente non tutta la documentazione è stata aggiornata per la nuova versione ancora :( – Jorn

1

Un altro modo di scrivere:

spyOn(foo, 'bar'); 
expect(foo.bar).toHaveBeenCalled(); 
foo.bar.calls.reset(); 
Problemi correlati