2012-11-20 42 views
13

我有一個簡單的測試套件,裏面有一個it函數。我想查看某個函數,我調用函數中調用,所以我有這樣的事情:爲什麼我必須在beforeEach()中調用spyOn?

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

然而,這給我的錯誤:Expected a spy, but got Function.

隨便看看後,我看到所有例子中的spyOn都在beforeEach中。於是,我改變了我的測試:

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

而這個工作。我對茉莉花相當陌生,所以我可能會錯過一些明顯的東西,但我只想知道爲什麼它必須在beforeEachspyOn工作。使用beforeEach很容易,但我想更好地瞭解正在發生的事情。謝謝。

回答

10

這只是因爲Jasmine在不同的閉包中運行規格。 describeit只調用添加到隊列中並隨後由Jasmine執行的註冊回調。茉莉花總是清理間諜...

但你也可以將spyOn添加到it回調。

相關問題