2012-11-20 14 views
13

Ho una semplice suite di test che ha una funzione it al suo interno. Voglio vedere se una certa funzione viene chiamata all'interno della funzione sto chiamando, quindi non ho qualcosa di simile:Perché devo chiamare spyOn in beforeAach()?

describe("doStuff", function() { 
    var foo = new Foo(); 
    spyOn(foo, "doOtherStuff"); 
    foo.doStuff(true); 
    it("should do stuff and other stuff", function() { 
     expect(foo.stuffDone).toBe(true); 
     expect(foo.doOtherStuff).toHaveBeenCalled(); 
    }); 
}); 

Tuttavia, questo mi dà l'errore: Expected a spy, but got Function.

Dopo aver cercato un po ', Ho visto tutti gli esempi con spyOn in un beforeEach. Quindi, ho cambiato il mio test in:

describe("doStuff", function() { 
    var foo = new Foo(); 
    beforeEach(function() { 
     spyOn(foo, "doOtherStuff"); 
     foo.doStuff(true); 
    }); 
    it("should do stuff and other stuff", function() { 
     expect(foo.stuffDone).toBe(true); 
     expect(foo.doOtherStuff).toHaveBeenCalled(); 
    }); 
}); 

E questo funziona. Sono abbastanza nuovo per il gelsomino, quindi potrei semplicemente mancare qualcosa di ovvio, ma voglio solo sapere perché deve essere in un beforeEach per il spyOn per funzionare. È abbastanza facile usare semplicemente lo beforeEach, ma voglio capire meglio cosa sta succedendo. Grazie.

risposta

10

Questo è semplicemente perché Jasmine esegue le Specifiche in una chiusura diversa. Le chiamate describe e it registrano solo i callback aggiunti a una coda e successivamente eseguiti da Jasmine. E Jasmine ripulisce sempre le spie ...

Ma è anche possibile aggiungere spyOn alla richiamata it.

Problemi correlati