2012-11-20 8 views
13

Ich habe eine einfache Testsuite, die eine it Funktion darin hat. Ich möchte sehen, ob eine bestimmte Funktion innerhalb der Funktion aufgerufen wird, ich rufe, so habe ich so etwas wie dieses:Warum muss ich in einem beforeEach() spyOn aufrufen?

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

aber das gibt mir den Fehler: Expected a spy, but got Function.

Nach etwa einige suchen, Ich sah alle Beispiele die spyOn in einer beforeEach hatte. Also änderte ich meinen Test zu:

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

Und das funktioniert. Ich bin ziemlich neu bei Jasmin, so dass ich vielleicht etwas offensichtliches vermisse, aber ich möchte nur wissen, warum es in einem beforeEach für den spyOn funktionieren muss. Es ist einfach genug, einfach die beforeEach zu verwenden, aber ich möchte besser verstehen, was vor sich geht. Vielen Dank.

Antwort

10

Das ist einfach weil Jasmine die Specs in einem anderen Verschluss ausführt. Die Aufrufe describe und it registrieren nur Callbacks, die zu einer Warteschlange hinzugefügt und später von Jasmine ausgeführt werden. Und Jasmine räumt immer die Spione auf ...

Sie können aber auch spyOn zum it Rückruf hinzufügen.

Verwandte Themen