2015-07-21 15 views
11

Używam szpieg Jasmine (2.2.0), aby sprawdzić, czy wywołanie zwrotne jest wywoływane.Resetuj połączenie na szpiegu Jasmine nie wraca

kod Test:

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

To działa zgodnie z oczekiwaniami. Ale teraz, jestem dodanie drugiego poziomu:

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(); 
    }); 
}); 

Ten test nie wróci, bo widocznie done zwrotna nigdy nie jest wywoływana. Jeśli usuniemy linię spy.reset(), test zostanie zakończony, ale oczywiście zakończy się niepowodzeniem przy ostatnim oczekiwaniu. Jednak pole callCount wydaje się być undefined, a nie 2.

+0

czy to rzuca? –

+0

Spróbuj dodać procedury obsługi odrzucania dla swoich obietnic. – robertklep

+0

dodał '.catch (done)' na końcu łańcucha, pojawia się ten sam problem. Więc @Daniel, jeśli rzuca, nie mogę go wykryć. – Jorn

Odpowiedz

22

Składnia Jasmine 2 różni się od 1.3 w odniesieniu do funkcji szpiegowskich. Patrz dokumentacja Jasmine here.

Konkretnie zresetować szpiega z spy.calls.reset();

ten sposób badanie powinno wyglądać następująco:

// 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(); 
     }); 
    }); 
}); 

Zobacz skrzypce here

+0

Dzięki! Podobno nie cała dokumentacja jest aktualizowana dla nowej wersji :( – Jorn

1

Innym sposobem, aby ją napisać:

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